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

相关推荐
特立独行的猫a3 分钟前
仓颉语言UI开发实战:我用仓颉写了个桌面版力扣
算法·leetcode·ui·tauri·仓颉·cj-tarui
y1su20 分钟前
Leetcode 动态规划 模板
java·数据结构·算法·leetcode·动态规划
All for pursuit.1 小时前
【位运算-3】136.只出现一次的数字
数据结构·c++·算法·leetcode
MoRanzhi12031 小时前
106.正则问题(分治)
python·算法·正则表达式·蓝桥杯·递归·分治算法·字符串处理
suhan2 小时前
【数据结构】五、树:7.哈夫曼树、哈夫曼编码
数据结构·算法·排序算法
kkhimself2 小时前
POJ-3126
算法
suhan2 小时前
【数据结构】五、树:6.平衡二叉树AVL
数据结构·算法·排序算法
suhan2 小时前
【数据结构】五、树:5.二叉排序树BST
数据结构·算法·排序算法
爱读书的小胖2 小时前
80. 删除有序数组中的重复项 II
java·数据结构·算法
臻选云栗子3 小时前
PCDN跑不起来?先别甩锅给平台,问题可能出在这
算法·程序员