给你一个 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]
解题方法:(标记)
1.经过分析,这道题使用标记法来进行解题,所以所以我们需要提前初始化一个结果列表。
2.由于这个螺旋矩阵的规律是,每到边界处都要进行90度
的方向转变,所以我们需要初始化一个方向数组。
3.然后开始遍历矩阵,将当前索引到的值加入ans
中,然后将我们走过的元素赋值为无穷大。
4.在添加完元素进ans
后,我们需要检查一下下一个位置是否有越界的现象,有的话我们可以通过(di+1)%4
的方式进行转向。
5.因为我们有4中状态需要转换,最后一次方向和开始的方向一致,刚好使用取余是最好的。
class Solution {
private static final int[][] DIRS = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
public List<Integer> spiralOrder(int[][] matrix) {
int m = matrix.length;
int n = matrix[0].length;
List<Integer> ans = new ArrayList<>(m * n);
int i = 0;
int j = 0;
int di = 0;
for (int k = 0; k < m * n; k++) {
ans.add(matrix[i][j]);
matrix[i][j] = Integer.MAX_VALUE;
int x = i + DIRS[di][0];
int y = j + DIRS[di][1];
if (x < 0 || x >= m || y < 0 || y >= n || matrix[x][y] == Integer.MAX_VALUE) {
di = (di + 1) % 4;
}
i += DIRS[di][0];
j += DIRS[di][1];
}
return ans;
}
}