题目建议: 本题关键还是在转圈的逻辑,在二分搜索中提到的区间定义,在这里又用上了。
题目链接:https://leetcode.cn/problems/spiral-matrix-ii/
视频讲解:https://www.bilibili.com/video/BV1SL4y1N7mV/
一 我的思路
我这一开始完全没思路,不知道怎么让数字按螺旋转起来。
后来看了教程,才明白核心就是一圈一圈填数字,每次都按 “右→下→左→上” 的顺序走,填完一圈就把边界往里缩一点,再填下一圈。
我的步骤:
先定好矩阵的四个边界:最上、最下、最左、最右
从数字 1 开始,按顺序填:
从左到右填最上面一行,填完就把上边界往下挪一格
从上到下填最右边一列,填完就把右边界往左挪一格
从右到左填最下面一行,填完就把下边界往上挪一格
从下到上填最左边一列,填完就把左边界往右挪一格
重复上面的步骤,直到所有数字都填完。
二 代码的实现
class Solution { public: vector<vector<int>> generateMatrix(int n) { vector<vector<int>> res(n, vector<int>(n, 0)); int top = 0, bottom = n - 1; int left = 0, right = n - 1; int num = 1; while (num <= n * n) { for (int i = left; i <= right && num <= n * n; i++) res[top][i] = num++; top++; for (int i = top; i <= bottom && num <= n * n; i++) res[i][right] = num++; right--; for (int i = right; i >= left && num <= n * n; i--) res[bottom][i] = num++; bottom--; for (int i = bottom; i >= top && num <= n * n; i++) res[i][left] = num++; left++; } return res; } };三 我遇到的困难
1 一开始完全不知道怎么控制方向,总想着用一堆 if 判断,越写越乱。
2 边界总是忘更新,填完一行没缩边界,导致数字重复填到同一个位置。
3 写循环的时候,一会儿 i++ 一会儿 i--,很容易搞反,尤其是从右往左、从下往上的时候。
4 数组越界报错,后来才知道每个循环里都要加上 num <= n * n 来控制
四 学习总结
学会了用边界控制来模拟螺旋过程,这样就不用自己写复杂的逻辑了,只要按固定顺序填、按规则缩边界就行。
虽然写得很慢,还一直写错边界,但我把模板背下来了,以后遇到类似的矩阵题,就能直接套用了,也算有收获啦!