顺时针打印矩阵(java)
题目描述:
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
样例:
输入:matrix=[[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]
题解:
设置边界条件,就像推箱子,推不动了就换方向,按照向右->向下->向左->向上的循环 。l,t,r,b分别代表左,上,右,下的边界。具体过程如图解:
代码:
public static int[] spiralOrder(int[][] matrix) {
if(matrix.length == 0)
return null;
int l = 0, t = 0, r = matrix[0].length-1, b = matrix.length-1;
int cou = 0;
int[] res = new int[(r+1)*(b+1)];
while(true) {
//水平向右方向
for(int i = l; i <= r; i ++) {
res[cou++] = matrix[t][i];
}
if(++t > b) {
break;
}
//垂直向下方向
for(int i = t; i <= b; i ++) {
res[cou++] = matrix[i][r];
}
if(--r < l) {
break;
}
//水平向左方向
for(int i = r; i >= l; i --) {
res[cou++] = matrix[b][i];
}
if(--b < t) {
break;
}
//垂直向上方向
for(int i = b; i >= t; i --) {
res[cou++] = matrix[i][l];
}
if(++l > r) {
break;
}
}
return res;
}
public static void main(String[] args) {
int[][] matrix = {{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}};
int[] res = spiralOrder(matrix);
for(int i = 0; i < res.length; i ++) {
System.out.print(res[i] + " ");
}
}