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

 

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

 1  public List<Integer> spiralOrder(int[][] matrix) {
 2                     List<Integer> list=new ArrayList();
 3                     if(matrix.length==0) return list;
 4                     int a=0, b=matrix[0].length-1, c=0, d=matrix.length-1;
 5                     while(a<=b&&c<=d){ //边界 ,下面的for里面边界防止多次打印或溢出
 6                             for(int i=a;i<=b;i++) //左到右
 7                                 list.add(matrix[c][i]);
 8                            c++;                        //一行打印完后进入下一行
 9                            for(int i=c;i<=d&&c<=d;i++)  //上到下
10                                list.add(matrix[i][b]); 
11                           b--;                           //缩小列边界
12                           for(int i=b;i>=a&&a<=b&&c<=d;i--)  //下面的右到左
13                               list.add(matrix[d][i]); 
14                           d--;                            //缩小行边界
15                          for(int i=d;i>=c&&a<=b&&c<=d;i--)   //下到上
16                             list.add(matrix[i][a]);
17                         a++;                        //进入下一列
18                     }
19               return list;
20            }

  方法二:针对左上角是每一圈的起始位置 从(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;
            }

 

posted @ 2020-03-29 14:52  浪波激泥  阅读(251)  评论(0编辑  收藏  举报