目录
1.题目描述
难度:中等
给你一个m行n列的矩阵matrix
,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
示例
-
示例1
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]] 输出:[1,2,3,6,9,8,7,4,5]
-
示例2
```java
输入: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]
```
提示
m == matrix.length
n == matrix[i].length
1 <= m, n <= 10
-100 <= matrix[i][j] <= 100
2.题目解答
方法一:模拟顺时针螺旋
解题思路
1.本题适合使用左闭右闭区间,如果使用左闭右开区间,在某些情况下会漏掉最后的一些元素。
2.可以将矩阵看成若干层,首先输出最外层的元素,其次输出次外层的元素,直到输出最内层的元素。
3.对于每层,从左上方开始以顺时针的顺序遍历所有元素。假设当前层的左上角位于 (top,left),右下角位于(bottom,right),按照如下顺序遍历当前层的元素:
⑴从左往右遍历上侧元素,从(top,left)到(top,right),top++;
⑵从上到下遍历右侧元素,从(top,right)到(bottom,right),right--;
⑶从右到左遍历底部元素,从(bottom,right)到(bottom,left),bottom--;
⑷从下到上遍历左侧元素,从(bottom,left)到(top,left),left++。
4.遍历完当前层的元素之后,进入下一层继续遍历,直到遍历完所有元素为止。
5.时间复杂度:O(mn),其中 m 和 n 分别是输入矩阵的行数和列数。矩阵中的每个元素都要被访问一次。
6.空间复杂度:O(1)。除了输出数组以外,空间复杂度是常数。
public class Solution {
public List<Integer> spiralOrder(int[][] matrix) {
LinkedList<Integer> result = new LinkedList<>();
if (matrix == null || matrix.length == 0) {
return result;
}
int left = 0;
int right = matrix[0].length - 1;
int top = 0;
int bottom = matrix.length - 1;
int numElm = matrix.length * matrix[0].length;
while (numElm > 0) {
// 上行从左往右
for (int i = left; i <= right && numElm > 0; i++) {
result.add(matrix[top][i]);
numElm--;
}
top++;
// 右列从上往下
for (int i = top; i <= bottom && numElm > 0; i++) {
result.add(matrix[i][right]);
numElm--;
}
right--;
// 下行从右往左
for (int i = right; i >= left && numElm > 0; i--) {
result.add(matrix[bottom][i]);
numElm--;
}
bottom--;
// 左列从下往上
for (int i = bottom; i >= top && numElm > 0; i--) {
result.add(matrix[i][left]);
numElm--;
}
left++;
}
return result;
}
}