Leetcode59.螺旋矩阵 II

本文最后更新于:4 个月前

59. 螺旋矩阵 II

给你一个正整数 n ,生成一个包含 1 到 \(n^2\) 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵。

Alt text

示例 1: 输入: n = 3 输出: [[1,2,3],[8,9,4],[7,6,5]]

示例 2: 输入: n = 1 输出: [[1]]

提示: · 1 <= n <= 20

解题思路

初始化一个 n×n 大小的矩阵 mat,然后模拟整个向内环绕的填入过程:

1.定义当前左右上下边界 l,r,t,b,初始值 num = 1,迭代终止值 tar = n * n

2.当 num <= tar 时,始终按照从左到右、从上到下、从右到左、从下到上的填入顺序循环,每次填入后: a.执行 num += 1:得到下一个需要填入的数字; b.更新边界:例如从左到右填完后,上边界 t += 1,相当于上边界向内缩1。

3.使用num <= tar而不是l < r || t < b作为迭代条件,是为了解决当n为奇数时,矩阵中心数字无法在迭代过程中被填充的问题。

4.最终返回 mat 即可。

Alt text

作者:Krahets 链接:https://leetcode.cn/problems/spiral-matrix-ii/solutions/12594/spiral-matrix-ii-mo-ni-fa-she-ding-bian-jie-qing-x/ 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
int t = 0, l = 0, r = n - 1, b = n - 1; //定义初始上、左、右、下边界
int num = 1;
vector<vector<int>> res(n, vector<int>(n)); //定义一个二维vector存储结果
while (num <= n * n) {
for (int i = l; i <= r; ++i) res[t][i] = num++;
++t; //上边界下移
for (int i = t; i <= b; ++i) res[i][r] = num++;
--r; //右边界左移
for (int i = r; i >= l; --i) res[b][i] = num++;
--b; //下边界上移
for (int i = b; i >= t; --i) res[i][l] = num++;
++l; //左边界右移
}
return res;
}
};

总结

看起来边界条件复杂的一道题目,经过K神的简化能写得如此清晰、优美,着实让人五体投地。