【leetcode-数组】对角线遍历
题目:
给定一个含有 M x N 个元素的矩阵(M 行,N 列),请以对角线遍历的顺序返回这个矩阵中的所有元素,对角线遍历如下图所示。
示例:
输入:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
输出: [1,2,4,7,5,3,6,8,9]
解释:
说明:
给定矩阵中的元素总数不会超过 100000 。
思路:
观察规律, 利用每层的索引和相等
假设矩阵无限大
索引和为{偶}数,从左向上遍历,{横}索引值递减,列索引值递增,遍历值依次是(x,0),(x-1,1),(x-2,2),…,(0,x)
索引和为{奇}数,从右向下遍历,{纵}索引值递减,横索引值递增,遍历值依次是(0,y),(1,y-1),(2,y-2),…,(y,0)
0: (00)
1: (01)(10)
2: (20)(11)(02)
3: (03)(12)(21)(30)
4: (40)(31)(22)(13)(04)
5: (05)(14)(23)(32)(41)(50)
6: (60)(51)......... .......(06)
java代码:
class Solution {
public int[] findDiagonalOrder(int[][] matrix) {
if (matrix == null) {
return null;
}
if(matrix.length ==0) {
return new int[0];
}
int m = matrix.length;
int n = matrix[0].length;
int[] res = new int[m * n];
int i = 0;
int j = 0;
for (int l = 0; l < m * n; l++) {
res[l] = matrix[i][j];
if ((i + j) % 2 == 0) {//从左往上遍历
if(j==n-1) {//走到了列的最右边,行往下移一格 准备右往下遍历
i++;
}else if(i==0) { //走到了行的最上边,列往右移一格 准备右往下遍历
j++;
}else {
i--;
j++;
}
}else {//从右往下遍历
if(i==m-1) { //走到了行的最下边,列往右移一格 准备左往上遍历
j++;
}else if(j==0) {//走到了列的最左边,行往下移一格 准备左往上遍历
i++;
}else {
i++;
j--;
}
}
}
return res;
}
}