顺时针打印矩阵
题目来源:牛客网
对于一个矩阵,请设计一个算法从左上角(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