剑指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:总感觉我使用这个方法麻烦了,请大佬指点指点