LeetCode 59.螺旋矩阵Ⅱ
大约 1 分钟
**题目描述:**给定正整数n,将1到n²按顺时针顺序填入n×n的正方形矩阵,返回该矩阵。

- 循环不变量:考虑每一圈的四条边按左闭右开进行处理
思路:
- 每一圈从(startx, starty)位置开始
- 上:行号不变,列号从 starty(闭)到 starty + n - offset(开)
- 右:行号从 startx(闭)到 startx + n - offset(开),列号不变
- 下:行号不变,列号从 starty + n - offset(闭)到 starty(开)
- 左:行号从 startx + n - offset(闭)到 startx(开)
- 更新startx、starty、offset(每次+2)
- n为奇数,单独处理中心位置

class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
int offSet = 1;
int count = 1;
int startx = 0;
int starty = 0;
int loop = 0;
vector<vector<int>> result(n,vector<int>(n,0)); //定义一个返回值
while(loop < n/2) {//根据规律找需要循环的次数
int i = startx;
int j = starty;
for(; j < n - offSet; ++j) {//前闭后开
result[i][j] = count++;
}
for(; i < n - offSet; ++i) {
result[i][j] = count++;
}
for(; j > starty ; --j) {
result[i][j] = count++;
}
for(; i > startx; --i) {
result[i][j] = count++;
}
++offSet; //n - offSet为x末端
++startx; //x的前端
++starty;
++loop; //循环次数
}
if(n % 2 == 1) {//若为奇数,会剩最后一个
result[n/2][n/2] = count;//最后一个元素
}
return result;
}
};