54. 螺旋矩阵

题目描述

给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。

输入输出

1
2
3
4
5
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]

输入: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,left),右下角位于 (bottom,right),按照如下顺序遍历当前层的元素。

  • 从左到右遍历上侧元素,依次为 (top,left) 到 (top,right)
  • 从上到下遍历右侧元素,依次为 (top+1,right) 到 (bottom,right)
  • 如果 left<right 且 top<bottom,则从右到左遍历下侧元素,依次为 (bottom,right−1) 到 (bottom,left+1),以及从下到上遍历左侧元素,依次为 (bottom,left) 到 (top+1,left)。

遍历完当前层的元素之后,将 left 和 top 分别增加 1,将 right 和 bottom 分别减少 1,进入下一层继续遍历,直到遍历完所有元素为止。

关键点:第16行需要这个if-else条件是因为为了防止出现[[3],[2]]这样的矩阵 不加if-else会输出[3,2,2]

java实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class Solution {
public List<Integer> spiralOrder(int[][] matrix) {
List<Integer> result = new ArrayList<Integer>();
if(matrix == null || matrix.length == 0 || matrix[0].length == 0) {
return result;
}
int rows = matrix.length, columns = matrix[0].length;
int left = 0, right = columns - 1, top = 0, bottom = rows - 1;
while(left <= right && top <= bottom){
for(int column = left; column <= right; column++){
result.add(matrix[top][column]);
}
for(int row = top + 1; row <= bottom; row++){
result.add(matrix[row][right]);
}
if(left < right && top < bottom){
for(int column = right - 1; column > left; column--){
result.add(matrix[bottom][column]);
}
for(int row = bottom; row > top; row--){
result.add(matrix[row][left]);
}
}
left++;right--;top++;bottom--;
}
return result;
}
}