【力扣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;
}
相关推荐
hhhhhaaa几秒前
多节点矩阵式任务系统:统一配置中心与动态规则引擎架构设计
后端·算法·架构
吃着火锅x唱着歌11 分钟前
LeetCode 739.每日温度
算法·leetcode·职场和发展
如竟没有火炬13 分钟前
去除重复字母——贪心+单调栈
开发语言·数据结构·python·算法·leetcode·深度优先
薛定e的猫咪23 分钟前
【ICML 2025】MODULI:基于扩散模型解锁离线多目标强化学习的偏好泛化
人工智能·学习·算法·机器学习
Brilliantwxx25 分钟前
【C++】priority_queue以及 仿函数 的学习
开发语言·c++·笔记·学习·算法
风味蘑菇干26 分钟前
斗地主案例
java·数据结构·算法
洛水水1 小时前
【力扣100题】39.二叉树的最近公共祖先
算法·leetcode·职场和发展
无敌昊哥战神1 小时前
【LeetCode 134】加油站:图解指针跳跃与 O(N) 极简贪心,避开 Python 隐藏坑!
c语言·python·算法·leetcode
人道领域1 小时前
【LeetCode刷题日记】222.极速计算完全二叉树节点数:O(log²n)算法揭秘
java·数据结构·算法·leetcode·深度优先
目黑live +wacyltd1 小时前
算法备案的实操指南(含截图示例)
人工智能·算法·llm·大模型备案·算法备案