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 小时前
PTA团体程序设计天梯赛L1真题讲解L1-077-080
开发语言·c++·算法·深度优先·pat考试·图论
qeen874 小时前
【数据结构】自平衡二叉搜索树各种旋转算法原理解析及AVL树的C++实现
数据结构·c++·算法
lucas_AI5 小时前
1.2B 小模型赢过 235B 大模型:NaviDC-OCR 把文档解析卷明白了
人工智能·深度学习·算法
冻柠檬飞冰走茶5 小时前
PTA基础编程题目集 7-35有理数均值(C++语言实现)
开发语言·数据结构·c++·算法·均值算法
民乐团扒谱机6 小时前
【微实验】倒谱算法(Cepstrum)深度解析:原理、数学推导与代码实现
人工智能·算法·语音识别
evans在进步6 小时前
LeetCode 394:字符串解码——Java 单栈模拟与嵌套解析详解
java·python·leetcode
Nil2087 小时前
leetcode 189轮转数组
数据结构·算法·leetcode
-dzk-7 小时前
【动态规划】LC 118.杨辉三角
算法·动态规划
恣逍信点7 小时前
《凌微经》静态自悖——变化之自因
人工智能·科技·算法·机器学习·业界资讯·拓扑学·哲学