【力扣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;
}
相关推荐
黎阳之光1 小时前
黎阳之光:港口智能体集群,重塑智慧港口新范式
大数据·人工智能·算法·安全·数字孪生
大写的z先生1 小时前
【深度学习 | 论文精读】
深度学习·算法·语言模型
大肥羊学校懒羊羊1 小时前
质因数个数问题:高效分解算法详解
开发语言·c++·算法
米粒12 小时前
力扣算法刷题Day 49(接雨水)
算法·leetcode·职场和发展
探物 AI2 小时前
【感知实战·数据增强篇】深度解析目标检测中的图片数据增强算法,多图演示效果
人工智能·算法·目标检测
Evand J2 小时前
【MATLAB代码介绍】三维环境下的IMM(交互式多模型),使用CV和CT模型,EKF作为滤波,目标高精度、自适应跟踪定位
开发语言·算法·matlab·imm·代码介绍
ZC跨境爬虫2 小时前
3D 地球卫星轨道可视化平台开发 Day12(解决初始相位拥挤问题,实现卫星均匀散开渲染)
前端·javascript·算法·3d·json
子午2 小时前
蔬菜识别~Python+深度学习+卷积网络算法+图像识别+2026原创+蔬菜识别
python·深度学习·算法
6Hzlia2 小时前
【Hot 100 刷题计划】 LeetCode 155. 最小栈 | C++ 打包状态法 (最优雅的 O(1) 检索)
java·c++·leetcode