LCR 146.螺旋遍历二维数组

难度:🟡 中等

标签数组矩阵模拟

链接LCR 146. 螺旋遍历二维数组 (剑指 Offer 29. 顺时针打印矩阵)

题目描述

给定一个二维数组 array,请返回「螺旋遍历」该数组的结果。

示例 1:

输入:array = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]

示例 2:

输入:array = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
输出:[1,2,3,4,8,12,11,10,9,5,6,7]

解题思路

核心思想

本题的核心是模拟螺旋遍历矩阵的过程。我们可以把矩阵看作由多个“矩形框”嵌套而成,我们的任务就是一层一层地从外到内打印这些“矩形框”。

思路选择

按层模拟法 是解决此问题的最直观、最清晰的思路。

  • 我们定义四个变量 top, bottom, left, right 来表示当前需要遍历的“矩形框”的四个边界。

  • 在一个循环中,我们依次完成“从左到右”、“从上到下”、“从右到左”、“从下到上”四个步骤的遍历,每完成一步,就将对应的边界向内收缩。

  • 循环的条件是上边界不大于下边界,且左边界不大于右边界。

关键步骤

  1. 处理边界情况:如果矩阵为空,直接返回空数组。

  2. 初始化边界:初始化四个边界变量:top = 0, bottom = array.length - 1, left = 0, right = array[0].length - 1

  3. 循环遍历:当 left <= righttop <= bottom 时,持续循环。 a. 从左到右 (上边界): 遍历 array[top]leftright 的所有元素,然后 top++。 b. 从上到下 (右边界): 遍历 arraytopbottomright 列元素,然后 right--。 c. 从右到左 (下边界): 检查 top <= bottom 是否仍然成立。如果成立,遍历 array[bottom]rightleft 的所有元素,然后 bottom--。 d. 从下到上 (左边界): 检查 left <= right 是否仍然成立。如果成立,遍历 arraybottomtopleft 列元素,然后 left++

  4. 返回结果:循环结束后,所有元素都已按螺旋顺序存入结果数组,返回即可。

代码实现

/**
 * @param {number[][]} array
 * @return {number[]}
 */
var spiralArray = function (array) {
    if (array.length === 0 || array[0].length === 0) return [];

    // 初始化边界
    let top = 0, bottom = array.length - 1, left = 0, right = array[0].length - 1;
    const result = [];

    while (left <= right && top <= bottom) {
        // 1. 从左到右
        for (let i = left; i <= right; i++) {
            result.push(array[top][i]);
        }
        top++;

        // 2. 从上到下
        for (let i = top; i <= bottom; i++) {
            result.push(array[i][right]);
        }
        right--;

        // 3. 从右到左 (检查边界)
        if (top <= bottom) {
            for (let i = right; i >= left; i--) {
                result.push(array[bottom][i]);
            }
            bottom--;
        }

        // 4. 从下到上 (检查边界)
        if (left <= right) {
            for (let i = bottom; i >= top; i--) {
                result.push(array[i][left]);
            }
            left++;
        }
    }
    return result;
};

复杂度分析

  • 时间复杂度O(m × n) 其中 m 和 n 分别是矩阵的行数和列数。每个元素都会被访问且仅被访问一次。

  • 空间复杂度O(1) 不考虑存储返回结果的数组,我们只使用了常数个额外变量作为边界指针,空间消耗是恒定的。

相关题目

总结

本题是矩阵遍历的经典问题,主要考察对循环边界条件的细致处理能力。通过“按层模拟”并不断收缩边界的方法,可以清晰地、有条不紊地解决问题。在处理“从右到左”和“从下到上”的步骤时,需要额外进行边界检查,以防止在只有一行或一列的瘦长矩阵中出现重复遍历。

Copyright © Jun 2025 all right reserved,powered by Gitbook该文件修订时间: 2025-07-03 17:35:08

results matching ""

    No results matching ""

    results matching ""

      No results matching ""