【剑指Offer】19、顺时针打印矩阵 难度:中等
题目描述
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
示例 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]
我的思路:
可以将矩阵看成若干层,首先打印最外层的元素,其次打印次外层的元素,直到打印最内层的元素。
设置四个指针,top,bottom;left,right。
难点就在于何时跳出循环,当top>bottom
或者left>right
时跳出循环。
技能补充:
1、二维矩阵的行数和列数如何判断
matrix.length;//是矩阵的行数
matrix[0].length;//是矩阵的列数
2、注意ArrayList
和int[]
的用法
我源代码写的是int[]
版本的,牛客网上写的是ArrayList
版本的。
我的Java代码:
public int[] spiralOrder(int[][] matrix) {
//判断矩阵是否为空
if(matrix == null){
return new int[0];
}
int top = 0;
int right = matrix[0].length-1;
int bottom = matrix.length-1;
int left = 0;
int index = 0;//数组answer的索引
int[] answer = new int[(bottom+1)*(right+1)];//数组answer用来放输出元素,长度为矩阵的行数和列数之积
while (true){
// left to right
for (int i = left; i <= right; i++) {
answer[index++] = matrix[top][i];
}
if (++top > bottom) {
break;
}
// top to bottom
for (int i = top; i <= bottom; i++) {
answer[index++] = matrix[i][right];
}
if (left > --right) {
break;
}
// right to left
for (int i = right; i >= left; i--) {
answer[index++] = matrix[bottom][i];
}
if (top > --bottom) {
break;
}
// bottom to top
for (int i = bottom; i >= top; i--) {
answer[index++] = matrix[i][left];
}
if (++left > right) {
break;
}
}
return answer;
}