[英]Leetcode Problem: Sort the Matrix Diagonally | Help (but not too much)
問題:
矩陣對角線是單元格的對角線,從最頂行或最左列中的某個單元格開始,沿右下角方向延伸,直到到達矩陣的末端。 例如,從 mat[2][0] 開始的矩陣對角線(其中 mat 是 6 x 3 矩陣)包括單元格 mat[2][0]、mat 3和 mat[4][2]。
給定一個 mxn 整數矩陣 mat,按升序對每個矩陣對角線進行排序並返回結果矩陣。
我的問題:
我發現,對於一條特定的對角線,對角單元格的行和列的差異是相同的。 例如第 3,2,1 行 (mat[0][0]...mat[i][i]) 的差異顯然是 0,除此之外它的 -1、-2 等...
我可以提取所有差異<0的單元格..但這沒有幫助,因為我想要對角線單元格/線的順序
lst = [[3,3,1,1],[2,2,1,2],[1,1,1,2]]
new_list = []
for i in range(len(lst)):
for j in range(len(lst[0])):
if i-j < 0:
new_list.append(lst[i][j])
print(new_list)
output -> [3, 1, 1, 1, 2, 2]
到目前為止一切順利,我想不出一個優先考慮具體差異的代碼。 我首先想要所有 -1 單元格,然后是 -2 單元格……等等。我可以寫很多 if 語句,但這不是最佳解決方案……我幾乎被困在這里。 請幫助我一些新的想法。 請不要告訴我完整的解決方案。 只需將我推向正確的方向,感謝您的幫助!
您可以做的是用對角線 ID 識別每個 position。 然后按對角線 ID/值對展平的值進行排序,並將它們放回結果矩陣中:
def sortDiag(M):
rows,cols = len(M),len(M[0]) # matrix dimensions
diags = range(rows + cols - 1) # diagonal identifiers
diagNo = [ (d,r,c) for r in range(rows)
for c,d in enumerate(diags[-cols-r::][:cols]) ]
diagVal = [ (d,M[r][c]) for d,r,c in diagNo ] # values per diagonal
result = [[None]*cols for _ in range(rows)]
for (_,v),(_,r,c) in zip(sorted(diagVal),sorted(diagNo)):
result[r][c] = v # assign position with sorted value
return result
output:
M = [[3,3,1,1],[2,2,1,2],[1,1,1,2]]
print(*M,sep="\n")
[3, 3, 1, 1]
[2, 2, 1, 2]
[1, 1, 1, 2]
print(*sortDiag(M),sep="\n")
[1, 1, 1, 1]
[1, 2, 2, 2]
[1, 2, 3, 3]
在此示例中,對角線標識符是從 0 到 5 的數字, diagNo
中的坐標列表對應於以下分配:
[2, 3, 4, 5]
[1, 2, 3, 4]
[0, 1, 2, 3]
通過將排序位置(每個對角線)映射到排序值(每個對角線),我們可以將排序值分配給與每個對角線對應的位置。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.