LeetCode 热题 100 | 矩阵-54. 螺旋矩阵

时间:2025-01-18 19:16:11

题目讲解:LeetCode
重点:

  1. 按层模拟。四个标记。

思路:

  • 按层模拟
    1.每一层遍历 顶 右 底 左。每遍历完一个对应的边界需要处理。

复杂度:

  • m 和 n 分别是行数和列数
  • 时间复杂度:O(mn)。每个元素都要被访问一次。
  • 空间复杂度:O(1)。除了输出数组以外,空间复杂度是常数。
public List<Integer> spiralOrder(int[][] matrix) {
    List<Integer> result = new ArrayList<>();
    int curTop = 0;
    int curRight = matrix[0].length - 1;
    int curBottom = matrix.length - 1;
    int curLeft = 0;
    // 重点: 按层模拟, 每一层遍历 顶 右 底 左
    while (curLeft <= curRight && curTop <= curBottom) {
        // 当前层的最顶行
        for (int i = curLeft; i <= curRight; i++) {
            result.add(matrix[curTop][i]);
        }
        curTop++;
        // 当前层的最右列
        for (int i = curTop; i <= curBottom; i++) {
            result.add(matrix[i][curRight]);
        }
        curRight--;
        // 当前外层的最底行还存在
        if (curTop <= curBottom) {
            for (int i = curRight; i >= curLeft; i--) {
                result.add(matrix[curBottom][i]);
            }
        }
        curBottom--;
        // 当前外层的最左列还存在
        if (curLeft <= curRight) {
            for (int i = curBottom; i >= curTop; i--) {
                result.add(matrix[i][curLeft]);
            }
        }
        curLeft++;
    }
    return result;
}