题目来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/shun-shi-zhen-da-yin-ju-zhen-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
示例 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]
限制:
0 <= matrix.length <= 100
0 <= matrix[i].length <= 100
这个题就是转圈圈输出矩阵的元素。我们把矩阵看做一个矩形,每次按顺时针方向输出最外一层的元素,矩形嘛,我们只需要定好四个顶点的位置就可以确定了。那么最外层的矩阵的四个顶点为
(left, top) (right, top) (right, bottom) (left, bottom)
我们依次从左上到右上,从右上到右下,再从右下到左下遍历最外层元素,然后更改一点顶点位置,使下一次遍历下一层。
那么只需要将top+1 、left+1、right-1、bottom-1即可,逻辑想清楚了,我们就可以开始写代码了。
class Solution {
public int[] spiralOrder(int[][] matrix) {
if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {
return new int[0];
}
int rows = matrix.length;
int cols = matrix[0].length;
int[] rs = new int[rows * cols];
int index = 0;
int left = 0, right = cols - 1, top = 0, bottom = rows - 1;
while (left <= right && top <= bottom) {
//从左上到右上
for (int col = left; col <= right; col++) {
rs[index++] = matrix[top][col];
}
//从右上到右下
for (int row = top + 1; row <= bottom; row++) {
rs[index++] = matrix[row][right];
}
if (left < right && top < bottom) {
//从右下到左下
for (int col = right - 1; col > left; col--) {
rs[index++] = matrix[bottom][col];
}
//从左下到左上
for (int row = bottom; row > top; row--) {
rs[index++] = matrix[row][left];
}
}
top++;
left++;
right--;
bottom--;
}
return rs;
}
}