题目
给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。
输入:n = 3
输出:[[1,2,3],[8,9,4],[7,6,5]]
提示:以下是本篇文章正文内容,下面案例可供参考
解题思路:
寻找规律,模拟顺时针画矩阵的过程:
- 填充上行从左到右
- 填充右列从上到下
- 填充下行从右到左
- 填充左列从下到上
由外向内一圈一圈这么画下去。每画一条边都要坚持一致的左闭右开。
即上述例子的 [1,2,3) [3,4,5) [5,6,7) [7,8,9)
题解
示例:
#include<iostream>
#include<vector> //包含vector的头文件
using namespace std;
/*螺旋矩阵*/
class Solution{
public:
vector<vector<int>>array(int n){
vector<vector<int>> result(n,vector<int>(n,0)); //定义二维数组
int loop = n/2; //定义圈数
int mid = n/2; //如果n为奇数的话,定义矩阵中间的空格值
int startx = 0,starty = 0; //定义起始位置
int round = 1; //控制每一条边遍历的长度,每次循环右边界收缩一位
int count = 1;
int i,j;
while(loop--)
{
i = startx;
j = starty;
// 四个for循环就是模拟转了一圈
// 模拟填充上行从左到右(左闭右开)
for(j;j<n-round;j++)
{
result[i][j] = count++;
}
// 模拟填充右列从上到下
for(i;i<n-round;i++)
{
result[i][j] = count++ ;
}
// 模拟填充下行从右到左
for(j;j>startx;j--)
{
result[i][j] = count++;
}
// 模拟填充左列从下到上
for(i;i>starty;i--)
{
result[i][j] = count++;
}
// 第二圈开始的时候,起始位置要各自加1
startx++;
starty++;
round += 1;
}
// 如果n为奇数的话,需要单独给矩阵最中间的位置赋值
if(n%2 != 0)
{
result[mid][mid] = n*n;
}
return result;
}
};
int main(void)
{
Solution s;
int n = 4; //假设n=4
vector<vector<int>> res(n,vector<int>(n,0)); //定义数组res
res = s.array(n);
// 获取二维数组的行数和列数
int rows = res.size();
int cols = res[0].size();
// 遍历二维数组并打印所有元素
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < cols; j++)
{
cout << res[i][j] << " ";
}
cout << endl; // 每行打印完毕后换行
}
return 0;
}
运行结果:
假设n=3,运行结果:
总结
这次的数组题相比与之前的算法思想较少,更多的是找规律、模拟过程。
时间复杂度 O(n^2): 模拟遍历二维矩阵的时间
空间复杂度 O(1)