原题链接
给定一个含有 M x N 个元素的矩阵(M 行,N 列),请以对角线遍历的顺序返回这个矩阵中的所有元素,对角线遍历如下图所示。
示例:
输入:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
输出: [1,2,4,7,5,3,6,8,9]
解释:
说明:
给定矩阵中的元素总数不会超过 100000 。
207 0
有以下规律:
注意点:
3. 每次到下一趟, 都需要判断边界
class Solution {
public int[] findDiagonalOrder(int[][] mat) {
int m = mat.length;
int n = mat[0].length;
int[] ans = new int[m * n];
// k控制结果集的下标, i为每次 x+y的和
int k = 0;
int i = 0;
// 循环终止条件为 i< m+n-1
while (i < m + n - 1) {
// 进行第 1, 3, 5..趟
int x1 = i < m ? i : m - 1;
int y1 = i - x1;
while (x1 >= 0 && y1 < n) {
ans[k++] = mat[x1][y1];
x1--;
y1++;
}
// 进行偶数次趟, i需要 +1
i++;
if (i >= m + n - 1) {
break;
}
// 进行第 2, 4, 6..趟
int y2 = i < n ? i : n - 1;
int x2 = i - y2;
while (y2 >= 0 && x2 < m) {
ans[k++] = mat[x2][y2];
y2--;
x2++;
}
i++;
}
return ans;
}
}
参考:
【对角线遍历】 分析题目-找准规律-代码清晰易读-不要让自己迷失在随意的ifelse中