498. 对角线遍历
问题描述
给你一个大小为 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
解题思路与代码实现
class Solution {
/**
* 解题思路:
* 每条对角线的元素的行列下标之和是相等的:
* 其为奇数时,向左下遍历;
* 其为偶数时,向右上遍历
* 需要注意在碰到行列边界时,需要相应右移或者下移
*/
public int[] findDiagonalOrder(int[][] mat) {
int m = mat.length, n = mat[0].length;
int[] res = new int[m * n];
int row = 0, col = 0;
// 一共要访问m*n个元素
for (int i = 0; i < res.length; i++) {
res[i] = mat[row][col];
// 偶数向右上方继续寻找,碰到边界需要调整
if ((row + col) % 2 == 0) {
if (col == n - 1) { // 下移
row++;
} else if (row == 0) { // 右移
col++;
} else { // 右上
row--;
col++;
}
} else {
if (row == m - 1) { // 右移
col++;
} else if (col == 0) { // 下移
row++;
} else { // 左下
row++;
col--;
}
}
}
return res;
}
}