题目描述
题目来源:力扣(LeetCode)
题目链接:59. 螺旋矩阵 II
给你一个正整数
n,生成一个包含1到n2所有元素,且元素按顺时针顺序螺旋排列的n x n正方形矩阵matrix。
示例 1:
输入: n = 1
输出: [[1]]
示例 2:
输入: n = 3
输出: [[1,2,3],[8,9,4],[7,6,5]]
提示:
1 <= n <= 20
解题方法:按层模拟
思路
从最外层向内层遍历,待处理元素形成一个矩阵,由四个边界变量确定(包含边界)。
为了顺时针遍历,依次遍历待处理元素矩阵的上侧、右侧、下侧、左侧部分。
代码
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
// up, down, left, right 确定一个待处理元素形成的矩阵,包含边界
// num 表示当前填充元素,border 表示填充元素边界
int up = 0, down = n - 1, left = 0, right = n - 1, num = 1, border = n * n;
// ans 为结果数组
vector<vector<int>> ans(n, vector<int>(n));
// 循环不变式
while(num <= border) {
// 遍历待处理元素矩阵的最上侧部分
for(int i = left; i <= right && num <= border; ++i) {
ans[up][i] = num++;
}
// 剔除最上侧部分
++up;
// 遍历待处理元素矩阵的最右侧部分
for(int i = up; i <= down && num <= border; ++i) {
ans[i][right] = num++;
}
// 剔除最右侧部分
--right;
// 遍历待处理元素矩阵的最下侧部分
for(int i = right; i >= left && num <= border; --i) {
ans[down][i] = num++;
}
// 剔除最下侧部分
--down;
// 遍历待处理元素矩阵的最左侧部分
for(int i = down; i >= up && num <= border; --i) {
ans[i][left] = num++;
}
// 剔除最左侧部分
++left;
}
// 方法结果数组
return ans;
}
};