簡體   English   中英

Leetcode 問題:矩陣對角線排序幫助(但不要太多)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM