【力扣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;
}
相关推荐
退休倒计时4 小时前
【每日一题】LeetCode 53. 最大子数组和 TypeScript
数据结构·算法·leetcode·typescript
旖-旎4 小时前
FloodFill(图像渲染)(1)
c++·算法·深度优先·力扣
戴西软件4 小时前
戴西 DLM 许可授权管理系统:破解无网络环境下工业软件授权难题,助力制造企业降本增效
网络·人工智能·python·深度学习·程序人生·算法·制造
2601_961875245 小时前
法考资料2026|全套|资料已整理
数据结构·算法·链表·贪心算法·eclipse·线性回归·动态规划
无限码力5 小时前
美团研发岗 4月18号笔试真题 - 坐标
算法·美团笔试真题·美团笔试题·美团研发岗笔试题·美团研发岗4月18号真题
有点。5 小时前
C++倍增法(练习题)
c++·算法
智者知已应修善业6 小时前
【51单片机8位数码管同时倒计时从9999】2024-1-25
c++·经验分享·笔记·算法·51单片机
洛水水6 小时前
【力扣100题】86.柱状图中最大的矩形
算法·leetcode·职场和发展
渡之7 小时前
GRiM-Net 深度解析 | 无人机 GNSS 拒止场景下两阶段跨视角视觉定位框架
深度学习·算法·动态规划·无人机