大家好!我是曾续缘🙃
今天是《LeetCode 热题 100》系列
发车第 19 天
矩阵第 2 题
❤️点赞 👍 收藏 ⭐再看,养成习惯
给你一个
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
解题方法
- 定义四个方向数组
d
,表示顺时针螺旋的四个方向:右、下、左、上。 - 初始化变量
m
和n
分别为矩阵的行数和列数。 - 使用变量
i
和j
表示当前遍历的元素在矩阵中的位置。 - 使用变量
k
表示当前遍历的方向,初始值为0(表示向右)。 - 使用变量
step
表示剩余需要遍历的元素个数,初始值为m * n
。 - 进入循环,每次遍历一个元素:
- 将当前元素添加到结果列表
ans
中。 - 将当前元素的值修改为一个特殊的值,例如2500,表示已经遍历过。
- 计算下一个元素的位置,即
di = i + d[k][0]
和dj = j + d[k][1]
。 - 如果下一个元素的位置越界或者已经被访问过(值为2500),则改变遍历方向:
- 将
k
加1并对4取模,即k = (k + 1) % 4
。 - 计算新的下一个元素的位置,即
di = i + d[k][0]
和dj = j + d[k][1]
。
- 将
- 更新当前遍历的元素位置为下一个元素的位置,即
i = di
和j = dj
。 - 将剩余需要遍历的元素个数减1,即
step--
。
- 将当前元素添加到结果列表
- 返回结果列表
ans
。
Code
查看代码
java
class Solution {
public List<Integer> spiralOrder(int[][] matrix) {
List<Integer> ans = new ArrayList<Integer>();
int m = matrix.length, n = matrix[0].length;
int i = 0, j = 0, k = 0, setp = m * n;
int[][] d = {{0,1}, {1,0}, {0,-1}, {-1,0}};
while(setp-- > 0){
ans.add(matrix[i][j]);
matrix[i][j] = 2500;
int di = i + d[k][0], dj = j + d[k][1];
if(di < 0 || di >= m || dj < 0 || dj >= n || matrix[di][dj] == 2500){
k = (k + 1) % 4;
di = i + d[k][0];
dj = j + d[k][1];
}
i = di;
j = dj;
}
return ans;
}
}