codeTop100题(23)54. 螺旋矩阵

100 阅读1分钟

1. 题目

54. 螺旋矩阵

2. 分析

image.png

首先我们可以看到,在整个遍历过程中,我们主要分为4步:

  1. 右移(i+0, j+1)
  2. 右移到越界或者已遍历,下移(i + 1, j+0)
  3. 下移到越界或者已遍历,左移(i+0, j-1)
  4. 左移到越界或者已遍历,上移(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;
}