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

相关推荐
倒头就睡的小比特4 天前
算法竞赛C++常用的STL
c++·算法
小羊没烦恼!4 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
猎头南楼4 天前
知识社区推荐系统实践:新用户冷启动与长短期兴趣建模的挑战 资深推荐算法工程师
人工智能·深度学习·算法·机器学习
旖旎夜光4 天前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控
wzdark4 天前
大规模并行计算中的负载均衡算法研究4
算法
Because_of_Her14 天前
并查集-听课笔记
笔记·算法·并查集
码流子4 天前
高速公路安全监测实践:碰撞监测预警+物联网底座,从感知到处置的闭环
大数据·人工智能·物联网·算法·架构
another heaven4 天前
【算法/C++ MD5算法能否逆解码?原理、C++实现与同类哈希算法对比】
c++·算法·哈希算法
wzdark4 天前
从算法设计模式看编程思维的抽象能力4
算法
2601_962218614 天前
万象生鲜系统称重自动多退少补算法解决生鲜非标品痛点
大数据·数据库·人工智能·python·算法