从零开始学习c++,每天起码做一道leetcode题目,在此记录,希望最后能够有所收获!
一、题目描述
给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。
示例 1:
输入: n = 3
输出: [[1,2,3],[8,9,4],[7,6,5]]
示例 2:
输入: n = 1
输出: [[1]]
提示:
1 <= n <= 20
二、思路分析
这道题目并没有涉及到什么算法。但难度我个人觉得还是挺大的。
给人一种无从下手的感觉。因为每转一圈起始点和终止点都会发生变化,这就是很让人头疼的事。
最后的解法是:设置了i和j,也设置了startx和starty这两个值作为每次循环遍历时行和列的起始位置。同时,i和j则是不断移动的。设置了count,从1开始,随着行和列的遍历依次对二维数组ans进行赋值,然后自加1。
要考虑到n为奇数的情况,也就是转完圈后最中间的一个值没有被填充,所以我们要考虑判断n是否为奇数,如果为奇数的话,则应该在最后把中间的值填好,这一点要油漆的注意。
然后就是注意边界条件。代码如下
三、AC代码
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
int startx=0,starty=0;
int offset=1,count=1;
int i,j;
int loop=n/2;
vector<vector<int>>ans(n,vector<int>(n,0));
while(loop--){
for(j=starty;j<n-offset;j++){
ans[startx][j]=count++;
}
for(i=startx;i<n-offset;i++){
ans[i][j]=count++;
}
for(j;j>starty;j--){
ans[i][j]=count++;
}
for(i;i>startx;i--){
ans[i][starty]=count++;
}
starty++;
startx++;
offset++;
}
if(n%2==1){
ans[n/2][n/2]=count;
}
return ans;
}
};
四、总结
题目比较不好确定边界条件,如果能理清边界条件的话就比较好做。