【力扣hot100】【Leetcode 54】螺旋矩阵|边界控制 算法笔记及打卡(19/100)

【力扣】【Leetcode 54】螺旋矩阵|边界控制

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

示例 1:

复制代码
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]

示例 2:

复制代码
输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
输出:[1,2,3,4,8,12,11,10,9,5,6,7]

提示:

  • m == matrix.length
  • n == matrix[i].length
  • 1 <= m, n <= 10
  • -100 <= matrix[i][j] <= 100

参考解答:

c++ 复制代码
class Solution {
public:
    vector<int> spiralOrder(vector<vector<int>>& matrix) {
        vector<int> ans;
        if (matrix.empty()) return ans;
        int m = matrix.size(), n = matrix[0].size();
        int top = 0, bottom = m - 1; //上下边界
        int left = 0, right = n - 1; //左右边界

        while (true) {
            // 左 → 右
            for (int i = left; i <= right; ++i) ans.push_back(matrix[top][i]);
            if (++top > bottom) break; //等效于++top; if (top > bottom) break;
            
            // 上 → 下
            for (int i = top; i <= bottom; ++i) ans.push_back(matrix[i][right]);
            if (--right < left) break;
            
            // 右 → 左
            for (int i = right; i >= left; --i) ans.push_back(matrix[bottom][i]);
            if (--bottom < top) break;
            
            // 下 → 上
            for (int i = bottom; i >= top; --i) ans.push_back(matrix[i][left]);
            if (++left > right) break;
        }
        return ans;
    }
};

完整解法(由LLM辅助生成):

c++ 复制代码
#include <iostream>
#include <vector>
using namespace std;

int main() {
    int m, n;
    cin >> m >> n;
    vector<vector<int>> matrix(m, vector<int>(n));
    
    // 输入矩阵
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
            cin >> matrix[i][j];
        }
    }

    vector<int> ans;
    // 四个边界
    int top = 0;
    int bottom = m - 1;
    int left = 0;
    int right = n - 1;

    while (true) {
        // 1. 左 → 右
        for (int i = left; i <= right; i++) ans.push_back(matrix[top][i]);
        top++;
        if (top > bottom) break;

        // 2. 上 → 下
        for (int i = top; i <= bottom; i++) ans.push_back(matrix[i][right]);
        right--;
        if (left > right) break;

        // 3. 右 → 左
        for (int i = right; i >= left; i--) ans.push_back(matrix[bottom][i]);
        bottom--;
        if (top > bottom) break;

        // 4. 下 → 上
        for (int i = bottom; i >= top; i--) ans.push_back(matrix[i][left]);
        left++;
        if (left > right) break;
    }

    // 输出结果
    for (int x : ans) cout << x << " ";
    cout << endl;
    
    return 0;
}
相关推荐
Feynman’s boom6 小时前
PDF解析复盘
数据库·人工智能·算法·pdf解析
郝学胜-神的一滴7 小时前
《C++11 工程级应用01:告别冗长类型,开启简洁高效编码新时代》深度解读
开发语言·c++·算法·软件开发·系统设计
学习中.........8 小时前
Transformer 训练资源估算:以 CS336 GPT-2 XL 配置为例
人工智能·python·算法·机器学习·自然语言处理
Navigator_Z13 小时前
LeetCode //C - 1206. Design Skiplist
c语言·算法·leetcode
码行山野赴时序归途13 小时前
三道经典数组题:从暴力到最优的算法思维
c语言·开发语言·数据结构·算法·leetcode
徐小夕14 小时前
3分钟从想法到Agent上线:我们开源了一款AI可视化工作流“IDE”
前端·算法·github
sel_915 小时前
【强化学习】Hands-on Modern RL项目实践|OPD 算法完整解析
人工智能·深度学习·算法·机器学习·语言模型
Navigator_Z15 小时前
LeetCode //C - 1209. Remove All Adjacent Duplicates in String II
c语言·算法·leetcode
ShineWinsu17 小时前
对于 C++:C++14中从变量模板、泛型 Lambda 到并发与字面量的解析
c++·算法