leetcode 54螺旋矩阵

cpp 复制代码
class Solution {
public:
    vector<int> spiralOrder(vector<vector<int>>& matrix) {
        int m = matrix.size();       // m 行
        int n = matrix[0].size();    // n 列

        int left = 0;
        int right = n - 1;
        int top = 0;
        int bottom = m - 1;

        vector<int> ans;

        while(ans.size() < m * n){

            // 1. 上边:从左往右
            for(int i = left; i <= right && ans.size() < m * n; i++){
                ans.push_back(matrix[top][i]);
            }
            top++;

            // 2. 右边:从上往下
            for(int i = top; i <= bottom && ans.size() < m * n; i++){
                ans.push_back(matrix[i][right]);
            }
            right--;

            // 3. 下边:从右往左
            for(int i = right; i >= left && ans.size() < m * n; i--){
                ans.push_back(matrix[bottom][i]);
            }
            bottom--;

            // 4. 左边:从下往上
            for(int i = bottom; i >= top && ans.size() < m * n; i--){
                ans.push_back(matrix[i][left]);
            }
            left++;
        }

        return ans;
    }
};

这道题的核心思路就是:用 top、bottom、left、right 四个边界,一圈一圈地向里面缩。

你可以直接记成这个顺序:

复制代码
上:从左往右
右:从上往下
下:从右往左
左:从下往上

每走完一条边,就把对应边界往里面移动一次:

复制代码
top++;
right--;
bottom--;
left++;

具体对应关系是:

复制代码
上边:matrix[top][i]      → top++
右边:matrix[i][right]    → right--
下边:matrix[bottom][i]   → bottom--
左边:matrix[i][left]     → left++

例如:

复制代码
1  2  3
4  5  6
7  8  9

遍历顺序就是:

复制代码
1 → 2 → 3
        ↓
4   5   6
↑       ↓
7 ← 8 ← 9

第一圈得到:

复制代码
1 2 3 6 9 8 7 4

然后四个边界都缩进去,只剩:

复制代码
5

最终:

复制代码
1 2 3 6 9 8 7 4 5

你还要固定记住:

复制代码
int m = matrix.size();       // 行数
int n = matrix[0].size();    // 列数

所以:

复制代码
m → 行 → top / bottom
n → 列 → left / right

而:

复制代码
matrix[i][j]

永远是:

复制代码
matrix[行][列]
       i    j

最后,代码中的:

复制代码
ans.size() < m * n

是为了保证总共只加入 m*n 个元素,避免最后只剩一行或一列时重复访问。

你可以把整道题压缩成一句口诀:

上右下左绕一圈,走完一边缩一边,直到取满 m*n 个元素。

相关推荐
机器人零零壹1 天前
技术白皮书:iRobotCAM如何解决机器人激光切割应用中的核心难点,从CAD离线编程到双目视觉定位与轨迹自适应提升复杂空间曲线切割的精度、效率与柔性化水平
人工智能·算法
ZhengEnCi1 天前
大模型的分类到底怎么分:从基础模型到推理模型、从通用到专用的完整图谱
算法
取名真是1 天前
Python 算法知识点从基础到进阶
开发语言·python·算法
罗西的思考1 天前
【轻量化复刻大模型 / KIMI K3】KDA 模块交互式演示
人工智能·算法·机器学习
nm_zfyjt1 天前
信息流广告投放优化实践:线索成本评估模型与转化链路重构(家装建材案例)
算法·重构·内蒙古朋友圈广告服务商·内蒙古朋友圈获客
w_zero_one1 天前
算法--构造
java·数据结构·算法
其实防守也摸鱼1 天前
信创安全竞赛知识总结与题库
大数据·网络·人工智能·算法·安全·php
小超人诞生日记1 天前
C++ 智能指针的使用及其原理详解
c++·算法
AiNightVision1 天前
无人机夜视模块如何选择?——从参数指标到系统集成的完整选型指南
人工智能·算法·计算机视觉·车载系统·无人机·视频·智能硬件