Given a positive integer n
, generate an n x n
matrix
filled with elements from 1
to n2
in spiral order.
Example 1:
Input: n = 3 Output: [[1,2,3],[8,9,4],[7,6,5]]
Example 2:
Input: n = 1 Output: [[1]]
Constraints:
-
1 <= n <= 20
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>>nums(n,vector<int>(n,0));
int StartX=0,StartY=0;
int count=1;
int offset=1;
int loop=n/2;
while(loop--){
int i,j;
for(j=StartY;j<n-offset;j++){
nums[StartX][j]=count++;
}
for(i=StartX;i<n-offset;i++){
nums[i][j]=count++;
}
for(;j>StartY;j--){
nums[i][j]=count++;
}
for(;i>StartX;i--){
nums[i][j]=count++;
}
StartX++;
StartY++;
offset++;
}
if(n%2==1){
nums[n/2][n/2]=count;
}
return nums;
}
};
注意:
1.offset的初始值,其实就是因为数组的行和列都是从0开始的
2.注意边界条件,数组别越界了
3.每旋转一圈StartX、StartY和offset都要+1
4.总体思路是用到了左闭右开的原则,这点参考二分查找,每行每列的最后一个元素都是交给下一个循环的时候做
这道题的算法很简单,就是需要处理的边界条件有点绕,很容易没注意到就错了,小心数组的越界