题目要求
给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
示例 1:
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]
![](https://img.haomeiwen.com/i3436285/3d2c1d9acb61eb33.png)
示例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]
解题思路
直接使用模拟法。
定义四个指针,分别指向需要遍历的左、右、上、下边界。
在这四个边界范围内遍历,每次遍历完缩小边界。遍历的方法:
- 先遍历第一行,缩小上边界
- 再遍历最后一列,缩小右边界
- 遍历最后一行,缩小下边界
- 遍历第一列,缩小左边界
Java代码
class Solution {
public List<Integer> spiralOrder(int[][] matrix) {
List<Integer> res = new ArrayList<>();
int n = matrix.length, m = matrix[0].length;
int l = 0, r = m-1, t = 0, b = n-1;
while(l <= r && t <= b){
for(int i = l; i <= r; i++){
res.add(matrix[t][i]);
}
t++;
// 防止重复遍历
if(t > b) break;
for(int i = t; i <= b; i++){
res.add(matrix[i][r]);
}
r--;
// 防止重复遍历
if(r < l) break;
for(int i = r; i >= l; i--){
res.add(matrix[b][i]);
}
b--;
for(int i = b; i >= t; i--){
res.add(matrix[i][l]);
}
l++;
}
return res;
}
}
总结
这道题就是简单的模拟法。要注意四个边界的范围变化,以及最后几个元素的遍历,要提前break,防止重复遍历。
这道题在面试中还挺常见的,需要熟练掌握写法,防止面试的时候出现细节错误。
网友评论