498#对角线遍历
输入:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
输出: [1,2,4,7,5,3,6,8,9]
解释:

思路:两种对角线,向上(up)和向下(down)
观察发现,一条对角线中,i,j总是增加或者减少,且up和down交替
up操作:i--,j++直到超过边界
down: j--,i++直到超过边界
up的最后一个元素到down的第一个元素改变方式:
先让i不变,j+1,如果超过边界,则让i+1,j不变,然后将up状态->down状态
先让i不变,j+1,如果超过边界,则让i+1,j不变,然后将up状态->down状态
down->up down的最后一个元素到up的第一个元素改变方式:
先让i+1,j不变,如果超过边界,则让j+1,i不变,然后将down状态->up状态
先让i+1,j不变,如果超过边界,则让j+1,i不变,然后将down状态->up状态
class Solution {
public int[] findDiagonalOrder(int[][] matrix) {
//数组为空的情况
if(matrix == null || matrix.length == 0 || matrix[0].length == 0){
return new int[0];
}
//i为横坐标,j为纵坐标
int i=matrix.length;
int j=matrix[0].length;
int []res = new int[i*j];
boolean up=true;
int resIndex=0,iIndex=0,jIndex=0;
while(iIndex < i && jIndex < j){ //边界控制
if(up){
while(iIndex >=0 && jIndex >=0 && iIndex < i && jIndex <j){//遍历上升的所有数
res[resIndex++]=matrix[iIndex--][jIndex++];
}
iIndex++;jIndex--;//上面退出循环后多改变了一次,要先还原到up的最后一个元素的index状态
if(jIndex+1<j){
jIndex++;
}else{//到右边界,此时i+1
iIndex++;
}
up = false;
}else{// ↙ 的情况
while(iIndex >=0 && jIndex >=0 && iIndex < i && jIndex <j){
res[resIndex++] = matrix[iIndex++][jIndex--]; //遍历下降的所有数
}
iIndex--;jIndex++;//和up的解释相同
if(iIndex+1 < i ){//先i+1
iIndex++;
}else{ //会越界,j+1
jIndex++;
}
up=true;
}
}
return res;
}
}
posted on 2019-08-27 16:51 duan_zhiwei 阅读(143) 评论(0) 收藏 举报
浙公网安备 33010602011771号