lintcode : Matrix Zigzag Traversal


确定要打印斜线的两个端点(从左上角开始(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++]);
            }
        }
        
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值