题目
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
题目链接:顺时针打印矩阵
示例 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]
思路
就像剥橘子皮一样,由外向内逐层按照顺时针的顺序逐层剥橘子皮。
代码实现
//思路:由外向内,逐层打印
public static int[] spiralOrder(int[][] matrix) {
if (matrix == null || matrix.length <= 0 || matrix[0].length <= 0) {
return new int[0];
}
int rows = matrix.length;
int columns = matrix[0].length;
int top = 0;
int bottom = rows - 1;
int left = 0;
int right = columns - 1;
int[] orders = new int[rows * columns];
int index = 0;
while (left <= right && top <= bottom) {
//从左到右打印
for (int column = left; column <=right; column++) {
orders[index++] = matrix[top][column];
}
//从上向下打印
for (int row = top + 1; row <= bottom; row++) {
orders[index++] = matrix[row][right];
}
//这一句是为了防止最后只剩下一行一列的时候重复遍历
if (left < right && top < bottom) {
//从右向左打印
for (int column = right - 1; column > left; column--) {
orders[index++] = matrix[bottom][column];
}
//从下向上打印
for (int row = bottom; row > top; row--) {
orders[index++] = matrix[row][left];
}
}
left++;
right--;
bottom--;
top++;
}
return orders;
}
时间复杂度:O(mn),其中 mm 和 nn 分别是输入矩阵的行数和列数。矩阵中的每个元素都要被访问一次。
空间复杂度:O(1)。除了输出数组以外,空间复杂度是常数。