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

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

给你一个 m 行 n 列的矩阵 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;
}
相关推荐
一去不复返的通信er3 小时前
力扣-图论-岛屿数量
算法·leetcode·图论
程序 代码狂人6 小时前
切片表与分区表的区别(数据开发面试版)
java·大数据·开发语言·数据仓库·算法
HDU-Dade7 小时前
【校招笔试真题】简要介绍 Self-Attention 的前沿算法
人工智能·算法
Xin7708 小时前
LeetCode 79. 单词搜索(DFS 回溯法)
leetcode
小郎君6589 小时前
Vue keep-alive 切标签后滚动位置回顶?因为 onDeactivated 里读到的 scrollTop 是 0
算法
邵奈一10 小时前
GPT-6.1 Terra速度是Sol的3倍,价格减半
算法
RaaS10010 小时前
Node.js Brotli RCE 漏洞自查指南:fetch、undici、axios 都在影响面,三分钟确认你的版本
人工智能·深度学习·算法
shehuiyuelaiyuehao10 小时前
算法56,重排链表
数据结构·算法·链表
qq_4523962311 小时前
第四篇:《索引原理与实战:B-tree、Hash、GIN、GiST、BRIN》
算法·哈希算法·gin