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:
输入: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.解题思路
使用一个visited数组,标记下标i,j对应位置是否被访问过,顺时针遍历需要先向右走,如果走到尽头或者走到被访问过的元素时,就令j-=1,i+=1调整i,j的位置,使其移动到向下走的起点,同理当向下走到不符合的位置时,再调整,使其向左走,走到不符合的位置时,再调整,使其向上走,当向上走到不符合的位置时,调整j+=1,i+=1,重新进入下一次循环,直到m*n个位置均被访问过,退出外层循环,返回结果
3.代码实现
class Solution {
public List<Integer> spiralOrder(int[][] matrix) {
List<Integer> res = new ArrayList<>();
int m = matrix.length;
int n = matrix[0].length;
boolean[][] visited = new boolean[m][n];
int i = 0, j = 0;
int cnt = 0;
int all = m * n;
while (cnt < all) {
//先向右
while (j < n && !visited[i][j]) {
res.add(matrix[i][j]);
visited[i][j] = true;
j += 1;
cnt += 1;
}
j -= 1;
i += 1;
//向下遍历
while (i < m && !visited[i][j]) {
res.add(matrix[i][j]);
visited[i][j] = true;
i += 1;
cnt += 1;
}
i -= 1;
j -= 1;
//向左遍历
while (j >= 0 && !visited[i][j]) {
res.add(matrix[i][j]);
visited[i][j] = true;
j -= 1;
cnt += 1;
}
j += 1;
i -= 1;
//向上遍历
while (i >= 0 && !visited[i][j]) {
res.add(matrix[i][j]);
visited[i][j] = true;
i -= 1;
cnt += 1;
}
i += 1;
j += 1;
}
return res;
}
}