lt.498-对角线遍历
[案例需求]
[思路分析]
- 详细题解
[代码实现]
class Solution {
public int[] findDiagonalOrder(int[][] mat) {
// 每个矩阵对角线遍历次数为 count = m + n - 1;]
//在这些遍历中, 先向上遍历, 再向下遍历;
//注意, 每次遍历到边缘部位, 如果要回到下一个方向遍历的第一个元素, 还要对行数,和列数做出处理
int rowLen = mat.length;
int colLen = mat[0].length;
//结果矩阵 和 这个矩阵的索引 resindex
int[] res = new int[rowLen * colLen];
int resIndex = 0;
//遍历次数
int count = rowLen + colLen - 1;
int col = 0;
int row = 0;
for(int i = 0; i < count; i++){
//向上遍历, 也就是count为偶数的时候, 向上遍历
if(i % 2 ==0){
//边界处理很重要
//下面的while循环是完整的一次向上遍历过程
while(row >= 0 && col < colLen){
res[resIndex++] = mat[row][col];
row--;
col++;
}
//边界处理(向上-->向下遍历转换, 需要做边界处理)要分为两种
//一种是向上遍历时, 遍历完一个数值后, 行-1, 列 + 1, 此时还未到达矩阵的最后一列(col < colLen)
//当向上遍历取到了最后一列上的值的时候, 行 + 2, 列 - 1
if(col < colLen){
row++;
}else{
row += 2;
col--;
}
}else{
//下面的while循环是一次向下遍历的过程
while(col >= 0 && row < rowLen){
res[resIndex++] = mat[row][col];
row++;
col--;
}
//向下-->向上遍历的转换
if(row < rowLen){
col++;
}else{
row --;
col += 2;
}
}
}
return res;
}
}