【LeetCode】54. 螺旋矩阵

in programming •  3 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
Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!