給定一個含有 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. 示例:java
輸入:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
輸出: [1,2,4,7,5,3,6,8,9]
複製代碼
解釋: python
說明:數組
思路:bash
實例輸入的二維數組範圍均是0~2app
先觀察一下遍歷規律:(0,0)->(0,1)->(1,0)->(2,0)->(1,1)->(0,2)->(1,2)->(2,1)->(2,2)spa
數組索引(m,n),兩種改變方式一、(m-1,n+1) 二、(m+1,n-1)code
數組從(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)cdn
java:blog
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布爾值轉換兩次的錯誤。
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
複製代碼