面试题二十九:顺时针打印矩阵

方法一:定义边界:防止溢出或者重复打印

 public List<Integer> spiralOrder(int[][] matrix) {
                List<Integer> list=new ArrayList();
                if(matrix.length==0) return list;
                int a=0, b=matrix[0].length-1, c=0, d=matrix.length-1;
                while(a<=b&&c<=d){ //边界 ,下面的for里面边界防止多次打印或溢出
                        for(int i=a;i<=b;i++) //左到右
                            list.add(matrix[c][i]);
                       c++;                        //一行打印完后进入下一行
                       for(int i=c;i<=d&&c<=d;i++)  //上到下
                           list.add(matrix[i][b]); 
                      b--;                           //缩小列边界
                      for(int i=b;i>=a&&a<=b&&c<=d;i--)  //下面的右到左
                          list.add(matrix[d][i]); 
                      d--;                            //缩小行边界
                     for(int i=d;i>=c&&a<=b&&c<=d;i--)   //下到上
                        list.add(matrix[i][a]);
                    a++;                        //进入下一列
                }
          return list;
       }

方法二:针对左上角是每一圈的起始位置 从(0,0)(1,1)(2,2)等开始

 public List<Integer> spiralOrder(int[][] matrix) {
            List<Integer> list=new ArrayList();
            if(matrix==null || matrix.length<=0 || matrix[0].length<=0)
                 return list;
             int start=0;
             int columns=matrix[0].length;//
             int row= matrix.length;//
             while(columns>(start<<1) && row>(start<<1)){
                 int end_c=columns-1-start;
                 int end_r=row-1-start;
                 //左到右
                 for(int i=start;i<=end_c;i++)
                     list.add(matrix[start][i]);
                 //上到下
                 if(start<end_r)
                     for(int i=start+1;i<=end_r;i++)
                         list.add(matrix[i][end_c]);
                 //右到左
                 if(start<end_c&&start<end_r)
                     for(int i=end_c-1;i>=start;--i)
                         list.add(matrix[end_r][i]);
                 //下到上
                 if(start<end_c&&start<end_r-1)
                     for(int i=end_r-1;i>=start+1;--i)
                         list.add(matrix[i][start]);
                 start++;
             }   
             return list;
         }

猜你喜欢

转载自www.cnblogs.com/niliuxiaocheng/p/12705179.html