Leetcode 54. 螺旋矩阵
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/spiral-matrix
给你一个 m 行 n 列的矩阵 matrix ,请按照顺时针螺旋顺序,返回矩阵中的所有元素。
示例 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]
提示:
m == matrix.length
n == matrix[i].length
1 <= m, n <= 10
-100 <= matrix[i][j] <= 100
模拟:
模拟矩阵螺旋遍历的过程。要点如下:
- 遍历到边缘时会改变方向。用数组 dirX 和 dirY 来维持方向向量;
- 因为最多有4个方向,故添加一个变量dir来记录总共变向的次数。由于方向只会顺时针变化,使用 dir%4 可以很方便修改方向向量;
- 观察题目要求:矩阵中的数字均小于100,故用101来标记已经遍历过的数字,不需要像官方回答一样单独声明一个矩阵来维持遍历路径。
class Solution {
int[] dirX = {0, -1, 0, 1};
int[] dirY = {1, 0, -1, 0};
public List<Integer> spiralOrder(int[][] matrix) {
List<Integer> ans = new ArrayList<>();
int dir = 0, x = 0, y = 0;
ans.add(matrix[0][0]);
matrix[0][0] = 101;
for(int i=0;i<matrix.length*matrix[0].length;i++){
if(x+dirX[dir%4]<matrix.length && y+dirY[dir%4]<matrix[0].length &&
x+dirX[dir%4]>=0 && y+dirY[dir%4]>=0 &&
matrix[x+dirX[dir%4]][y+dirY[dir%4]] != 101){
ans.add(matrix[x+dirX[dir%4]][y+dirY[dir%4]]);
matrix[x+dirX[dir%4]][y+dirY[dir%4]] = 101;
x += dirX[dir%4];
y += dirY[dir%4];
}
else{
dir += 1;
i--;
if(ans.size()==matrix.length*matrix[0].length){
break;
}
}
}
return ans;
}
}