1. 题目
给定一个含有 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
2. 题解
2.1 解法1: 找规律
有以下规律:
- 每次遍历其 x, y 坐标和 x+y 是一样的
- 当为第1, 3, 5, … 趟,每遍历一个元素 x–, y++ ; 当第 2,4, 6…趟, 每遍历一个元素 x++, y–
注意点:
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;
}
}