【LeetCode】54. 螺旋矩阵

in #programming3 months ago

1 题目描述

54. 螺旋矩阵要求给定一个 mn 列的矩阵 matrix,请按照顺时针螺旋顺序返回矩阵中的所有元素。

2 解题思路

本题可以通过模拟的方式解决。我们可以通过迭代的方式来构建螺旋顺序的数组。对于每个循环,我们首先确定起始行和列,然后依次读取每一层的四个边(上、右、下、左)。每完成一层,我们更新起始行和列,并进入下一层,直到所有元素都被正确读取。

3 Java 代码实现

class Solution {
    public List<Integer> spiralOrder(int[][] matrix) {
        // 初始化起始位置和偏移量
        int startX = 0;
        int startY = 0;
        int offset = 1;
        int loop = 1;

        // 获取矩阵的长和宽
        int x = matrix.length;
        int y = matrix[0].length;

        // 创建结果列表
        List<Integer> ans = new ArrayList<Integer>();

        // 计算需要遍历的圈数
        while (loop <= Math.min(x, y) / 2) {

            // 向右遍历
            for (int j = startY; j < y - offset; j++) {
                ans.add(matrix[startX][j]);
            }

            // 向下遍历
            for (int i = startX; i < x - offset; i++) {
                ans.add(matrix[i][y - offset]);
            }

            // 向左遍历
            for (; j > startY; j--) {
                ans.add(matrix[x - offset][j]);
            }

            // 向上遍历
            for (; i > startX; i--) {
                ans.add(matrix[i][startY]);
            }

            // 更新起始位置和偏移量
            startX++;
            startY++;
            offset++;
            loop++;
        }

        // 处理特殊情况:当矩阵剩余部分为单行或单列时
        if (ans.size() < x * y) {
            if (x >= y) {
                for (int i = startX; i <= x - offset; i++) {
                    ans.add(matrix[i][startY]);
                }
            } else {
                for (int j = startY; j <= y - offset; j++) {
                    ans.add(matrix[startX][j]);
                }
            }
        }

        // 返回结果
        return ans;
    }
}
  • 时间复杂度: O(n^2),因为每个元素都被放置一次。
  • 空间复杂度: O(n^2),用于存储结果矩阵。

4 注意事项

  • 边界条件处理:当矩阵的行数或列数为奇数时,需要特别处理中心点或剩余边的填充。
  • 循环次数:循环的次数是 min(x, y) / 2,因为每次循环都会处理外圈的一层。
  • 更新偏移量:随着循环的进行,需要不断更新偏移量 offset 和起始点 startX, startY