lintcode : Matrix Zigzag Traversal

来源:互联网 发布:淘宝助理看不到订单 编辑:程序博客网 时间:2024/06/15 17:48


确定要打印斜线的两个端点(从左上角开始(0,0),(0,0)),然后打印一条斜线,用一个boolean变量记录打印的方向

上面的端点从左向右移动,到达右边界后,再从上向下移动。

下面的端点从上到下移动,到达下边界后,再从左向右移动。

直到两个端点重合在(n-1,m-1)停止。


public int[] printZMatrix(int[][] matrix) {

        // write your code here
       
        
        if(matrix==null || matrix.length==0){
            return new int[0];
        }
        int x1=0;
        int y1=0;
        int x2=0;
        int y2=0;
        
        List<Integer>list=new ArrayList<Integer>();
        boolean flag=true;
        
        int row=matrix.length;
        int col=matrix[0].length;
        
        while(x1<row && y2<col){
            printLine(matrix,x1,y1,x2,y2,!flag,list);//打印(x1,y1),(x2,y2)确定的一条斜线

            flag=!flag;//转化打印方向


            if(y1<col-1){//向右移动
                y1++;
            }else{//到达右边界后向下移动
                x1++;
            }
            
            if(x2<row-1){//向下移动
                x2++;
            }else{//到达下边界后向右移动
                y2++;
            }
            
        }
        int []res=new int[list.size()];
        int i=0;
        for(Integer k:list){
            res[i++]=k;
        }
        return res;

    }

//这个函数专门用来打印一条斜线

//flag在true和false中转换,代表从   左下到右上打印  和 从右上到左下打印  方向变化

//(x1,y1)和(x2,y2)分别表示斜线的两个端点,

    public void printLine(int[][] matrix,int x1,int y1,int x2,int y2,boolean flag, List<Integer>list){
        
        if(flag){
            while(x1<=x2 && y1>=y2){
                list.add(matrix[x1++][y1--]);
            }
        }else{
            while(x2>=x1 && y2<=y1){
                list.add(matrix[x2--][y2++]);
            }
        }
        
    }
0 0
原创粉丝点击