给你一个大小为 m x n 的矩阵 mat ,请以对角线遍历的顺序,用一个数组返回这个矩阵中的所有元素。
示例 1:
输入:mat = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,4,7,5,3,6,8,9]
示例 2:
输入:mat = [[1,2],[3,4]]
输出:[1,2,3,4]
提示:
- m == mat.length
- n == mat[i].length
- 1 <= m, n <= 104
- 1 <= m * n <= 104
- -105 <= mat[i][j] <= 105
观察上面图:
- 当向上时,r--, c++
- 当向下时,r++, c--
注意临界点,超过边界的处理
- 当向上时。看第三列,此时 c = col - 1 => (0, 2),下一步需要向下移动,所以右移,即 r++。看第一列,当 r = 0 => (0, 0),下一步需要向下,右移,看图可知 c++;
- 当向下时??吹诙校耸?c = 0 => (1, 0),下一步需要向上移动,右移,即r++。看第四列,此时 r = row - 1 => (2, 1),下一步需要向上移动,右移,即c++
public int[] findDiagonalOrder(int[][] mat) {
int row = mat.length, col = mat[0].length;
int[] res = new int[row * col];
int r = 0, c = 0;
for (int i = 0; i < res.length; i++) {
res[i] = mat[r][c];
if ((r + c) % 2 == 0) {
// 偶数,是向上的
if (c == col - 1) {
// 下一步是向下移动,此时右移 r++
r++;
} else if (r == 0) {
// 下一步向上移动
c++;
} else {
r--;
c++;
}
} else {
// 奇数,向下
if (r == row - 1) {
// 下一步是向上移动,此时右移 row++
c++;
} else if (c == 0) {
// 下一步向上移动
r++;
} else {
r++;
c--;
}
}
}
return res;
}
方法二:官方答案
class Solution {
public int[] findDiagonalOrder(int[][] mat) {
int m = mat.length;
int n = mat[0].length;
int[] res = new int[m * n];
int pos = 0;
for (int i = 0; i < m + n - 1; i++) {
if (i % 2 == 1) {
int x = i < n ? 0 : i - n + 1;
int y = i < n ? i : n - 1;
while (x < m && y >= 0) {
res[pos] = mat[x][y];
pos++;
x++;
y--;
}
} else {
int x = i < m ? i : m - 1;
int y = i < m ? 0 : i - m + 1;
while (x >= 0 && y < n) {
res[pos] = mat[x][y];
pos++;
x--;
y++;
}
}
}
return res;
}
}
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/diagonal-traverse
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。