数组的模拟
因为要对二维矩阵螺旋赋值,所以规定对每一次上线左右四条边的遍历都采用同一种规则:
对每一条边都是执行左闭右开的for循环,这样四条边就共用同一规则。
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> res(n,vector<int>(n)); //二维数组的定义
int row = 0,column = 0; //行和列
int offset = 1; //用来存每次循环的边界值即控制循环次数
int mid = n >> 1; //如果数组是奇数个,中间值需要单独赋值
int ans = 1; //赋给数组的数,每次赋值后要++
int loop = n >> 1; //螺旋旋转次数,n为9只需要旋转一圈
while(loop --) //持续循环旋转直到旋转次数为0
{
int i = row,j = column; //这里不能将i和j在for循环中定义,因为后面还要用到
for(;j < n - offset;j ++) //每次loop的row和column是不同的,offset也是不同的
{
res[row][j] = ans;
ans ++;
}
for(;i < n - offset;i ++)
{
res[i][j] = ans ++;
}
for(;j > column;j --) res[i][j] = ans ++;
for(;i > row;i --) res[i][j] = ans ++;
row ++,column ++;
offset ++;
}
if(n % 2 != 0) res[mid][mid] = ans;
return res;
}
};