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 个元素。

相关推荐
北域码匠2 小时前
高通滤波算法深度解析(High-Pass Filter)
stm32·算法·c#·数字信号处理·嵌入式开发·滤波算法·高通滤波
指掀涛澜天下惊3 小时前
强化学习进阶篇八 策略梯度算法
深度学习·学习·算法·强化学习
乌萨奇也要立志学C++3 小时前
【洛谷】kmp算法
开发语言·算法
禹凕3 小时前
Dijkstra算法详解与应用
python·算法
YaraMemo4 小时前
元启发式算法框架
人工智能·算法·5g·信息与通信·启发式算法·信号处理
weixin_307779134 小时前
一维无粘 Burgers 方程的激波形成问题:MacCormack 格式求解
c++·算法·matlab
HugoStudio_SWAN5 小时前
洛谷 B4500 / B4449 / B3843 凯撒密码、密码强度与密码合规——加密与安全的三道门
c++·学习·程序人生·算法·安全
枫叶林FYL6 小时前
【群体智能集群控制工程实践】第3章 一致性协同算法
算法
禹凕6 小时前
滑动窗口算法实战指南
python·算法
DisonTangor6 小时前
【腾讯混元雪耻归来】 Hy4 preview:770B 参数 MoE 旗舰模型,1M 上下文全面开源
人工智能·算法·开源·aigc·腾讯云·腾讯云ai代码助手