【力扣】498/1424:對角線遍歷

498:題目描述

給定一個含有 M x N 個元素的矩陣(M 行,N 列),請以對角線遍歷的順序返回這個矩陣中的所有元素,對角線遍歷如下圖所示。

算法

class Solution:
    def findDiagonalOrder(self, matrix: List[List[int]]) -> List[int]:
        if not matrix:return []
        ls=[]
        m,n=len(matrix),len(matrix[0])
        x,y=0,0
        flag=True
        for i in range(m+n):
            if flag:
                while 0<=x<m and 0<=y<n:
                    ls.append(matrix[x][y])
                    x-=1
                    y+=1
                x+=1
                y-=1# 復原位置
                #這一部分先是向右探,如果不符合就向下探
                if 0<=x<m and 0<=y+1<n:
                    y+=1
                else:
                    x+=1
                flag=False
            else:
                while 0<=x<m and 0<=y<n:
                    ls.append(matrix[x][y])
                    x+=1
                    y-=1
                y+=1
                x-=1
                #這一部分先是向下探,如果不符合就向右探
                if 0<=x+1<m and 0<=y<n:
                    x+=1
                else:
                    y+=1
                flag=True
        return ls

執行用時 :268 ms, 在所有 Python3 提交中擊敗了37.63%的用戶
內存消耗 :16.4 MB, 在所有 Python3 提交中擊敗了33.33%的用戶

這裏基於1424,補充一個算法:

class Solution:
    def findDiagonalOrder(self, matrix: List[List[int]]) -> List[int]:
        if not matrix:return []
        ls=[]
        d={}
        for i in range(len(matrix)):
            for j in range(len(matrix[0])):
                if i+j in d:
                    d[i+j].append(matrix[i][j])
                else:
                    d[i+j]=[matrix[i][j]]
        for i in sorted(d.keys()):
            if not i%2:
                ls+=d[i][::-1]
            else:
                ls+=d[i]
        return ls

執行用時 :224 ms, 在所有 Python3 提交中擊敗了86.04%的用戶
內存消耗 :16.8 MB, 在所有 Python3 提交中擊敗了33.33%的用戶

1424:題目描述

給你一個列表 nums ,裏面每一個元素都是一個整數列表。請你依照下面各圖的規則,按順序返回 nums 中對角線上的整數。
在這裏插入圖片描述

算法

由於對於每個元素來說,座標和是定值,於是:

class Solution:
    def findDiagonalOrder(self, nums):
        d={}
        res=[]
        for i in range(len(nums)):
            for j in range(len(nums[i])):
                if i+j in d:
                    d[i+j].append(nums[i][j])
                else:
                    d[i+j]=[nums[i][j]]
        for i in sorted(d.keys()):
            res+=d[i][::-1]
        return res

執行用時 :232 ms, 在所有 Python3 提交中擊敗了94.85%的用戶
內存消耗 :34.9 MB, 在所有 Python3 提交中擊敗了100.00%的用戶

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章