按照如图所示的方法遍历, 可以看出来需要走行数加列数减一次。
设置i表示第i次遍历,可以看出当i为偶数时,矩阵从左下方往右上方遍历,当i为奇数时,矩阵从右上往左下方遍历。所以关键点是确定每一次遍历开始前的起始位置。
当从左下方往右上方遍历时:
如果i<行数时,起始位置是(i,0);
如果i>行数时,起始位置是(行数-1,i -行数+1)
当从右上方往左下方遍历时:
如果i<列数时,起始位置是(0,i);
如果i>列数时,起始位置是(i -列数+1,列数-1);
代码如下:
class Solution {
public int[] findDiagonalOrder(int[][] mat) {
int rowlength = mat.length;
int colength = mat[0].length;
int[] res = new int [rowlength * colength];
int i = 0, index = 0, x = 0, y = 0;
while(i < rowlength + colength){
if (i % 2 == 0){
x = i < rowlength? i : rowlength- 1;
y = i < rowlength? 0 : i - rowlength + 1;
while(x >= 0 && y< colength){
res[index] = mat[x][y];
x--;
y++;
index++;
}
i++;
}
else{
x = i < colength? 0 : i - colength + 1;
y = i < colength? i : colength -1;
while(y>=0 && x< rowlength){
res[index] = mat[x][y];
x++;
y--;
index++;
}
i++;
}
}
return res;
}
}