顺时针打印矩阵

 

题目来源:牛客网

对于一个矩阵,请设计一个算法从左上角(mat[0][0])开始,顺时针打印矩阵元素。

给定int矩阵mat,以及它的维数nxm,请返回一个数组,数组中的元素为矩阵元素的顺时针输出。

测试样例:
[[1,2],[3,4]],2,2
返回:[1,2,4,3]


一个n行m列的矩阵


图中startY=endY=1,表示只剩下一行了。因为X方向还没到尽头(startX=1,endX=2)。
同理,当startX==endX时,表示只剩下一列了。
 1 public int[] clockwisePrint(int[][] mat, int n, int m) {
 2 
 3     int[] res = new int[n*m];
 4     if(mat ==null) return res;
 5 
 6     int i=0;
 7 
 8     int startX=0, startY=0,endX=m-1,endY=n-1;
 9     while(startX<=endX && startY<=endY){
10 
11         // 剩下一列
12         if(startX==endX){
13             for(int j=startY;j<=endY;++j)
14                 res[i++] = mat[j][startX];
15             break;
16         }
17 
18         // 剩下一行
19         if(startY==endY){
20             for(int j=startX;j<=endX;++j)
21                 res[i++] = mat[startY][j];
22             break;
23         }
24 
25         // 从左到右上面一行(除了右上角那个数)
26         for(int j=startX; j<endX; ++j) {
27             res[i++] = mat[startY][j];
28         }
29 
30         // 从上到下右边一列(除了右下角那个数)
31         for(int j=startY; j<endY; ++j) {
32             res[i++] = mat[j][endX];
33         }
34 
35         // 从右到左底部一行(除了左下角那个数)
36         for(int j=endX; j>startX; j--) {
37             res[i++] = mat[endY][j];
38         }
39 
40         // 从下到上左边一列(除了左上角那个数)
41         for(int j=endY; j>startY; j--) {
42             res[i++] = mat[j][startX];
43         }
44 
45         startX++;
46         startY++;
47         endX--;
48         endY--;
49     }
50 
51     return res;
52 }
53   

 

 
posted @ 2016-07-05 20:44  duanguyuan  阅读(382)  评论(0编辑  收藏  举报