Leetcode 498:對角線遍歷Diagonal Traverse(python3、java)

對角線遍歷

給定一個含有 M x N 個元素的矩陣(M 行,N 列),請以對角線遍歷的順序返回這個矩陣中的所有元素,對角線遍歷如下圖所示。
Given a matrix of M x N elements (M rows, N columns), return all elements of the matrix in diagonal order as shown in the below image.
示例:

輸入:
[
 [ 1, 2, 3 ],
 [ 4, 5, 6 ],
 [ 7, 8, 9 ]
]
輸出:  [1,2,4,7,5,3,6,8,9]

解釋:
在這裏插入圖片描述

說明:

  1. 給定矩陣中的元素總數不會超過 100000 。

思路

​ 實例輸入的二維數組範圍均是0~2

​ 先觀察一下遍歷規律:(0,0)->(0,1)->(1,0)->(2,0)->(1,1)->(0,2)->(1,2)->(2,1)->(2,2)

​ 數組索引(m,n),兩種改變方式1、(m-1,n+1) 2、(m+1,n-1)

​ 數組從(0,0)開始,先是(m-1,n+1) ,(0,0)->(-1,1)此時m=-1,超出範圍,m賦值0。然後切換索引改變方式(m+1,n-1),執行兩次(0,1)->(1,0)->(2,-1),n賦值0得到(2,0),再次切換爲索引改變方式(m-1,n+1)直到下次超出範圍(2,0)->(1,1)->(0,2)->(-1,3)。此時m<0且n>2均超出範圍,(m+2,n-1),應當優先判斷n是否超出範圍,執行(m+2,n-1)->(1,2),避免因爲m<0再次切換一次索引改變方式。然後正常切換後:(1,2)->(2,1)->(3,0),因爲m>2,切換方式並(m-1,n+2)

java:

class Solution {
    public int[] findDiagonalOrder(int[][] matrix) {
        if (matrix.length==0||matrix[0].length==0)return new int[0];
        int col=matrix.length,row=matrix[0].length;
        int nums=col*row,m=0,n=0;
        int res[]=new int[nums];
        boolean flag=true;

        for(int i=0;i<nums;i++){
            res[i]=matrix[m][n];
            if(flag){
                n+=1; m-=1;
            }else{
                n-=1; m+=1;
            }
            if(m>=col){
                m-=1; n+=2; flag=true;
            }else if(n>=row){
                n-=1; m+=2; flag=false;
            }
            if(m<0){
                m=0; flag=false;
            }else if(n<0){
                n=0; flag=true;
            }
        }
        return res;
    }
}

注意點:

if (matrix.length==0||matrix[0].length==0)return new int[0];首先判斷是否爲空數組,另外 matrix.length==0||matrix[0].length==0 判斷條件順序不能顛倒,因爲如果 matrix.length==0 後面的 matrix[0].length==0 不會再判斷,即返回空數組;但是matrix[0].length==0 在前時,如果輸入數組爲空,matrix[0] 會報錯因爲matrix並沒有0號索引。

​ for循環裏應當先判斷m、n是否大於或等於各自的最大長度,然後執行(m-1,n+2)、(m+2,n-1)。避免出現m、n同時小於0時flag布爾值轉換兩次的錯誤。

python:

class Solution:
    def findDiagonalOrder(self, matrix: List[List[int]]) -> List[int]:
        if(len(matrix)==0 or len(matrix[0])==0):
            return []
        col=len(matrix)
        row=len(matrix[0])
        nums=col*row
        m=n=0
        flag=True
        res=[]
        for i in range(nums):
            res.append(matrix[m][n])
            if flag:
                m-=1
                n+=1
            else:
                m+=1
                n-=1
            if m>=col:
                m-=1
                n+=2
                flag=True
            elif n>=row:
                m+=2
                n-=1
                flag=False
            if m<0:
                m=0
                flag=False
            elif n<0:
                n=0
                flag=True
        return res

在這裏插入圖片描述

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