力扣题目链接
给你一个正整数 n
,生成一个包含 1
到 n2
所有元素,且元素按顺时针顺序螺旋排列的 n*n 正方形矩阵 matrix
。
示例 1:
输入:n = 3 输出:[[1,2,3],[8,9,4],[7,6,5]]
示例 2:
输入:n = 1 输出:[[1]]
提示:
1 <= n <= 20
思路
找规律很容易发现数字增大方向是右下左上,元素个数并不相同,但有规律,例如:n=5时,右下左上方向依次元素个数为5、4、4、3、3、2、2、1、1,n=7时,右下左上方向依次元素个数为7、6、6、5、5、4、4、3、3、2、2、1、1。除了首元素,其余均有规律,可以将下左上右归纳一起,元素个数即为循环次数(有规律),只需要找到从下左上右开始的起始位置即可。
解法1
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> array(n, vector<int>(n, 0));
//首行元素
for(int i=0;i<n;i++)
{
array[0][i] = i+1;
}
int flag=n+1;
int y=0, x=0,m=n*n+1;
while(flag!=m)
{
//下
for (int i=0;i<n-1-x;i++) //循环次数
{
array[i+1+y][n-1-y] = flag++; //1+y为行起始位置 n-1-y为列起始位置
}
//右
for (int i=0;i<n-1-x;i++)
{
array[n-1-y][n-2-y-i] = flag++;
}
//上
for (int i=0;i<n-2-x;i++)
{
array[n-2-y-i][y] = flag++;
}
//左
for (int i=0;i<n-2-x;i++)
{
array[y+1][i+y+1] = flag++;
}
y++; //控制边界
x+=2; //控制循环次数
}
return array;
}
};
第一次向下给元素赋值到下一次,元素个数减少2,其余方向同理,所以设置x变量进行记录。
- 时间复杂度 O(n^2):元素操作次数
- 空间复杂度 O(1)