剑指Offer第十二题:顺时针打印矩阵

问题描述

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.

问题分析

 1 , 2 , 3 , 4 ,

 5 , 6 , 7 , 8 ,

 9 ,10,11,12,

13,14,15,16

 

 由题目可以得出,其实题目的意思就是先沿最上边,然后最右,最下,最左依次遍历。

算法分析

 1 , 2 , 3 , 4 ,

 5 , 6 , 7 , 8 ,

 9 ,10,11,12,

13,14,15,16

 

0 , 0 , 0 , 0 , 0 , 0

0 , 1 , 2 , 3 , 4 , 0

0 , 5 , 6 , 7 , 8 , 0

0, 9 ,10,11,12 , 0

0,13,14,15,16 , 0

0 , 0 , 0 , 0 , 0 ,0

  • 我记得有一种算法叫不撞南墙不回头,我们先按照由左到右依次遍历,被遍历的地方我们把值变成0,但是遍历到什么结束?遍历到下一个数值是0的时候,转向下遍历。依次当下一个为0,再向左遍历......
  • 所有,为了满足要求,我们先将数组边界填充0。
  • 然后开始遍历

源代码

 1  public static ArrayList<Integer> printMatrix(int [][] matrix) {
 2         int row=matrix.length;//
 3         int current=matrix[0].length;//
 4         ArrayList<Integer> list=new ArrayList<>();
 5         int i=1;
 6         int j=1;
 7         int [][] newAry=new int[row+2][current+2];
 8         for(int h=0;h<row+2;h++) {
 9             for(int k=0;k<current+2;k++) {
10                 if(h==0||k==0||h==(row+1)||k==(current+1)) {
11                     newAry[h][k]=0;
12                 }else {
13                     newAry[h][k]=matrix[h-1][k-1];
14                 }
15             }
16         }
17         while(newAry[i-1][j]!=0||newAry[i][j-1]!=0||newAry[i+1][j]!=0||newAry[i][j+1]!=0) {
18             if(newAry[i][j+1]!=0&&newAry[i-1][j]==0) {
19                 list.add(newAry[i][j]);
20                 newAry[i][j]=0;
21                 j++;
22             }else if(newAry[i+1][j]!=0) {
23                 list.add(newAry[i][j]);
24                 newAry[i][j]=0;
25                 i++;
26             }else if(newAry[i][j-1]!=0) {
27                 list.add(newAry[i][j]);
28                 newAry[i][j]=0;
29                 j--;
30             }else if(newAry[i-1][j]!=0) {
31                 list.add(newAry[i][j]);
32                 newAry[i][j]=0;
33                 i--;
34             }
35         }
36         list.add(newAry[i][j]);
37         return list;
38         
39     }

PS:总感觉我使用这个方法麻烦了,请大佬指点指点

posted @ 2018-09-04 17:24  轻抚丶两袖风尘  阅读(103)  评论(0编辑  收藏  举报