498#对角线遍历

输入:
[
 [ 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状态
down->up 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)    收藏  举报

导航