題目描述
給你一個 m * n 的整數矩陣 mat ,請你將同一條對角線上的元素(從左上到右下)按升序排序後,返回排好序的矩陣。
算法思路
class Solution:
def diagonalSort(self, mat):
self.m, self.n = len(mat), len(mat[0])
self.change = (1, 1)
# pack函數用來進行對角線遍歷,並對值排序
def pack(i, j):
t=[]
while 0 <= i < self.m and 0 <= j < self.n:
t.append(mat[i][j])
i += self.change[0]
j += self.change[1]
return sorted(t, reverse=True)
# unpack函數用來重新裝載數組
def unpack(i, j, t):
while t:
mat[i][j] = t.pop()
i += self.change[0]
j += self.change[1]
# 主函數
for i in range(self.n - 1, -1, -1):
unpack(0, i, pack(0, i))
for i in range(1, self.m):
unpack(i,0, pack(i,0))
return mat
執行用時 :104 ms, 在所有 Python3 提交中擊敗了53.96%的用戶
內存消耗 :13.8 MB, 在所有 Python3 提交中擊敗了100.00%的用戶
優化
利用對角線的差值相同這一點,進行一次遍歷就分別保存了所有的對角線數組
class Solution:
def diagonalSort(self, mat: List[List[int]]) -> List[List[int]]:
m, n = len(mat), len(mat[0])
d = collections.defaultdict(list)
for i in range(m):
for j in range(n):
d[i-j].append(mat[i][j])
for k in d:
d[k].sort(reverse=1)
for i in range(m):
for j in range(n):
mat[i][j] = d[i-j].pop()
return mat
執行用時 :88 ms, 在所有 Python3 提交中擊敗了96.95%的用戶
內存消耗 :14 MB, 在所有 Python3 提交中擊敗了100.00%的用戶
d = collections.defaultdict(list)