当前位置:首页 > 力扣 > LeetCode 54 螺旋矩阵 题解:螺旋矩阵的C++实现

LeetCode 54 螺旋矩阵 题解:螺旋矩阵的C++实现

2天前


LeetCode 54 螺旋矩阵 题解:螺旋矩阵的C++实现 LeetCode54 C++算法 模拟法 边界控制 第1张

一、题目解读

LeetCode 54题“螺旋矩阵”要求将给定的二维矩阵元素按螺旋顺序(顺时针)排列为一维数组。例如,对于矩阵[[1,2,3],[4,5,6],[7,8,9]],输出应为[1,2,3,6,9,8,7,4,5]。题目考察对矩阵遍历路径的规划能力,需确保不重复访问元素且顺序正确。

二、解题思路

通过维护上下左右四条边界动态控制遍历方向。核心思想是:按层处理矩阵,每层分为上→右→下→左四个方向遍历,访问完当前方向后调整边界,直至所有元素被访问。这种方法避免复杂坐标计算,利用循环与边界判断实现简洁逻辑。

三、解题步骤

1. 初始化:判断矩阵是否为空,若为空直接返回空数组。

2. 定义边界:top=0, bottom=m-1, left=0, right=n-1(m为行数,n为列数)。

3. 循环遍历:

○ 上层:从左到右遍历,res添加matrix[top][i],top++更新下边界。

○ 右层:从上到下遍历,添加matrix[i][right],right--更新左边界。

○ 下层:从右到左遍历,添加matrix[bottom][i],bottom--更新上边界。

○ 左层:从下到上遍历,添加matrix[i][left],left++更新右边界。

○ 每轮遍历后检查边界是否交叉(如top>bottom或left>right),若交叉则结束循环。

4. 返回结果:最终res即为螺旋顺序元素序列。

四、代码与注释

class Solution {
public:
    vector<int> spiralOrder(vector<vector<int>>& matrix) {
        if (matrix.empty()) return {};    // 空矩阵特判

        vector<int> res;                 // 结果数组
        int m = matrix.size(), n = matrix[0].size();   // 记录行列数
        int top = 0, bottom = m - 1, left = 0, right = n - 1;   // 初始化边界

        while (true) {
            // 从左到右遍历上层
            for (int i = left; i <= right; ++i) 
                res.push_back(matrix[top][i]);   // 添加元素,top上移
            if (++top > bottom) break;          // 上边界越界则终止

            // 从上到下遍历右层
            for (int i = top; i <= bottom; ++i)
                res.push_back(matrix[i][right]);   // 添加元素,right右移
            if (--right < left) break;           // 右边界越界终止

            // 从右到左遍历下层
            for (int i = right; i >= left; --i)
                res.push_back(matrix[bottom][i]);   // 添加元素,bottom下移
            if (--bottom < top) break;            // 下边界越界终止

            // 从下到上遍历左层
            for (int i = bottom; i >= top; --i)
                res.push_back(matrix[i][left]);   // 添加元素,left左移
            if (++left > right) break;           // 左边界越界终止
        }
        return res;
    }
};

五、总结

1. 核心技巧:利用边界变量将复杂路径分解为四个方向的循环遍历,通过动态调整边界简化逻辑。

2. 时间复杂度:O(mn)(m行n列,每个元素被访问一次)。

3. 优化方向:可进一步思考坐标递推方法,但模拟法更直观易懂,适合新手理解。

4. 应用场景:类似“环形遍历”问题,需按特定路径访问多维数据时,边界控制是通用思路。


原创内容 转载请注明出处

分享给朋友:

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。