1. 题目
2. 分析
首先我们可以看到,在整个遍历过程中,我们主要分为4步:
- 右移(i+0, j+1)
- 右移到越界或者已遍历,下移(i + 1, j+0)
- 下移到越界或者已遍历,左移(i+0, j-1)
- 左移到越界或者已遍历,上移(i-1, j+0)
我们总共需要遍历n(数组长) * m(数组宽)次
3. 代码
public List<Integer> spiralOrder(int[][] matrix) {
int operate = 0;
int[] dpI = {0, 1, 0, -1};
int[] dpJ = {1, 0, -1, 0};
int n = matrix.length;
int m = matrix[0].length;
int count = n * m;
int i = 0, j = 0;
List<Integer> list = new ArrayList<>();
for (int i1 = 0; i1 < count; i1++) {
list.add(matrix[i][j]);
matrix[i][j] = -999;
int nextI = i + dpI[operate];
int nextJ = j + dpJ[operate];
if (nextI < 0 || nextI > n - 1 || nextJ > m - 1 || nextJ < 0 || matrix[nextI][nextJ] == -999) {
operate = (operate + 1) % 4;
nextI = i + dpI[operate];
nextJ = j + dpJ[operate];
}
i = nextI;
j = nextJ;
}
return list;
}