题意:
给定一个正整数 n,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。
示例:
输入: 3
输出:
[
[ 1, 2, 3 ],
[ 8, 9, 4 ],
[ 7, 6, 5 ]
]
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
}
};
思路:
模拟题
构建两个方向数组,一个表示列方向,一个表示行方向,每次当前坐标(x, y)加上当前方向坐标得到新的坐标(new_x, new_y), new_x = x + dirx, new_y = y + diry,然后判断新坐标是否越界或者会覆盖之前写过的值, 如果会,就要回退,并且发生方向变动,当方向数组发生越界,回退为从0开始即可。
代码:
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
// 初始化数组
vector<vector<int> > ans(n, vector<int>(n));
int dirx[4] = {0, 1, 0, -1}; // 行 方向
int diry[4] = {1, 0, -1, 0}; // 列 方向
int nowx = 0; // 行方向下标
int nowy = 0; // 列方向下标
int x = 0;
int y = 0;
for(int i=1; i<=n*n; i++){
ans[x][y] = i;
y += diry[nowy];
x += dirx[nowx];
if (y >= n || y < 0 || x >= n || x < 0 || ans[x][y] != 0){
y -= diry[nowy];
x -= dirx[nowx];
nowy ++;
nowx ++;
if(nowy >= 4) nowy = 0;
if(nowx >= 4) nowx = 0;
y += diry[nowy];
x += dirx[nowx];
}
}
return ans;
}
};
方向数组是一个二维平面移动处理很常用的技巧哦~