题目:
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
示例 1:
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]
示例 2:
输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
输出:[1,2,3,4,8,12,11,10,9,5,6,7]
分析:
遍历如图所示:
可以用4个for循环打印,按照如上图所示打印
- 当打印完1,2,3,4时,上边框+1
- 打印4,5,6 ,右边框-1
- 打印 6,7,8,9 下边框 -1
- 由于上边框已经+1,所以只能打印 9 ,10 ,再左边框+1
边界:
当对上边框+1,右边框-1,下边框 -1,左边框+1时,如果上边框>下边框或者左边框大于右边框,则跳出while。
Demo:
public int[] spiralOrder(int[][] matrix) {
if(matrix.length == 0) return new int[0];
int L=0 , R = matrix[0].length - 1 , T =0 , B = matrix.length - 1 , x=0;//上下左右边框
int[] arrs = new int[(R+1)*(B+1)];
while (true){
for (int i = L ; i <= R ; i++) //遍历上边框
arrs[x++] = matrix[T][i];
if (++T > B) break;
for (int i = T ; i <= B ; i++)//遍历右边框
arrs[x++] = matrix[i][R];
if (--R < L) break;
for(int i = R ; i >= L ; i--)//遍历下边框
arrs[x++] = matrix[B][i];
if(--B < T) break;
for(int i = B ; i >= T ; i--)//遍历左边框
arrs[x++] = matrix[i][L];
if(++L > R) break;
}
return arrs;
} }