59 螺旋矩阵
给你一个正整数 n
,生成一个包含 1
到 n2
所有元素,且元素按顺时针顺序螺旋排列的 n x n
正方形矩阵 matrix
。
示例 1:
输入:n = 3 输出:[[1,2,3],[8,9,4],[7,6,5]]
示例 2:
输入:n = 1 输出:[[1]]
写在前面:malloc分配二维数组m*n内存的方法
int **a=(int**)malloc(sizeof(int*)*m);
for(int i=0;i<m;i++){
a[i]=(int*)malloc(sizeof(int)*n);
}
*returnSize返回数组列数
*returnColumnSizes=(int *)malloc(sizeof(int)*m);//返回行数也要分配内存
(*returnColumnSizes)[i]=n;//第i行的列数为n
解题思路:采用左闭右开的思想。每次最后面的一个不处理。
设置循环初始位置,x=0,y=0
确定循环圈数 loop=n/2,最后圈数是奇数中间位置要填充一个
设置一个偏移量offset,每次循环x++,y++,loop--,offset++
模拟题意即可。
int** generateMatrix(int n, int* returnSize, int** returnColumnSizes) {*returnSize=n;//返回数组列数*returnColumnSizes=(int *)malloc(sizeof(int)*n);//返回行数//二维数组分配内存空间int **num=(int **)malloc(sizeof(int *)*n);int i,j;for(i=0;i<n;i++){num[i]=(int *)malloc(sizeof(int)*n);//分配列(*returnColumnSizes)[i]=n;//第i行的列数为n}int x=0,y=0;//起始位置int offset=1,cnt=1;int loop=n/2;//循环圈数for(loop=n/2;loop>0;loop--){for(j=y;j<n-offset;j++){num[x][j]=cnt++;}for(i=x;i<n-offset;i++){num[i][j]=cnt++;}for(j=n-offset;j>y;j--){num[i][j]=cnt++;}for(i=n-offset;i>x;i--){num[i][j]=cnt++;}x++;y++;offset++;}if(n%2!=0)num[x][y]=cnt;//奇数,填充中间的return num;
}