【力扣】1329:將矩陣按對角線排序 | 數組 | 對角線遍歷

題目描述

給你一個 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)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章