题目链接:59.螺旋矩阵II
零、描述
给定正整数 n ,生成一个包含 1 到 n 2 n^2 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix
例子:
示例 1:
输入: n = 3
输出: [[1,2,3],[8,9,4],[7,6,5]]
示例 2:
输入: n = 1
输出: [[1]]
一、解法:模拟
模拟矩阵的生成。
初始位置设为矩阵的左上角,初始方向设为向右。
若下一步的位置超出矩阵边界,或者是之前访问过的位置,则顺时针旋转,进入下一个方向。如此反复直至填入
n
2
n^2
n2个元素。
关键: 在转圈的逻辑
- 创建一个二维数组
vector<vector<int>> res(n,vector<int>(n));
- 顺时针顺序,先固定行数,从(top,left)到(top,right)
- 再固定列数,从(top+1,right)到(bottom,right) 【 注意:top需要+1】
- 再固定行数,从(bottom,right-1)到(bottom,left)
- 再固定列数,从(bottom-1,left)到(top+1,left) 【 注意:这时候由于上面top+1,所以此时到达的是top+1】
- 走完一圈
- 注意,此时是(top+1,left),并不是下一个循环的起点,而应该left+1
- 起点是(top+1,left+1)
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> res(n,vector<int>(n));
int up = 0, down = n - 1, left = 0, right = n - 1, index = 1;
while(index <= n * n){
for(int i = left; i <= right; i++){
res[up][i] = index++;
}
up++;
for(int i = up; i <= down; i++){
res[i][right] = index++;
}
right--;
for(int i = right; i >= left; i--){
res[down][i] = index++;
}
down--;
for(int i = down; i >= up; i--){
res[i][left] = index++;
}
left++;
}
return res;
}
};