解题思路
没有什么捷径,就是顺时针循环遍历矩阵即可,注意n为奇数时需要额外定义正中心格子数值为n^2。注意依次遍历矩阵边长时应当“左开右闭”,遍历最大矩阵边长也只能遍历n-1个单位,此后分别遍历n-3,n-5...个单位。注意这里的二维数组vector需要手动分配内存,否则编译器会报错。另外,数组表示矩阵的顺序是先行后列。
完整代码
#include <vector>
using namespace std;
class Solution {
public:
vector<vector<int> > generateMatrix(int n)
{
vector<vector<int>> matrix(n, vector<int>(n, 0));
int cont = 1;
for(int i = 1; i < n; i += 2)
{
int k = (i-1)/2;
for(int m = k; m < n-1-k; m++)
{
matrix[k][m] = cont;
cont++;
}
for(int j = k; j < n-1-k; j++)
{
matrix[j][n-1-k] = cont;
cont++;
}
for(int m = n-1-k; m > k; m--)
{
matrix[n-1-k][m] = cont;
cont++;
}
for(int j = n-1-k; j > k; j--)
{
matrix[j][k] = cont;
cont++;
}
}
if((n & 1) == 1)
matrix[(n-1)/2][(n-1)/2] = n*n;
return matrix;
}
};
int main()
{
Solution sol;
sol.generateMatrix(9);
return 0;
}
总结
1.使用malloc分配二维数组内存(假设给n行m列矩阵分配内存):
#include <stdlib>
int** matrix = (int**) malloc (sizeof(int*)*n);
for(int i = 0; i < n; i++)
int* matrix[i] = (int*) malloc (sizeof(int)*m);
//...
for(int i = 0; i < n; i++)
free(matrix[i]);
free(matrix);
2.使用vector定义二维数组也需要分配内存
首先看一维vector定义方法:
vector<int> arr (n, 0) //大小为n, 内部元素初始化为0;
对比批量定义vector:
vector<int> arr[n] //定义n个编号为arr[i] (0<i<n)的动态数组
再看本题里的矩阵定义方法:
vector<vector<int> > res(n, vector<int>(n, 0)) //大小为n×n的二维矩阵,并将其所有元素初始化为vector<int>(n, 0)。