LeetCode_59_螺旋矩阵 II

/**
 * Return an array of arrays of size *returnSize.
 * The sizes of the arrays are returned as *returnColumnSizes array.
 * Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
 */
int** generateMatrix(int n, int* returnSize, int** returnColumnSizes){
    int startx = 0, starty = 0;
    int loop = n/2;
    int offset = 1;
    int i, j;
    int** ret = malloc(sizeof(int*)*n);
    *returnSize = n;
    *returnColumnSizes = malloc(sizeof(int)*n);
    for (int i = 0; i < n; i++){
        ret[i] = malloc(sizeof(int)*n);
        memset(ret[i], 0, sizeof(int)*n);
        (*returnColumnSizes)[i] = n;
    }
    int num = 1;
    while (loop--){
        i = startx;
        j = starty;

        for (j = starty; j < starty + n - offset; j++){
            ret[startx][j] = num++;
        }
        for (i = startx; i < startx + n - offset; i++){
            ret[i][j] = num++;
        }
        for (; j > starty; j--){
            ret[i][j] = num++;
        }
        for (; i > startx; i--){
            ret[i][j] = num++;
        }
        startx++;
        starty++;
        offset += 2;
    }
    if (n % 2) ret[n/2][n/2] = num;
    return ret;
}

注意:j < starty + n - offset 而不是j < n - offset
ret[n/2][n/2] = num; 而不是ret[n/2][n/2] = num++;

基础知识

如何正确使用malloc函数进行动态分配

1.申请一维数组

一维数组的数组名可以看成数组起始元素的首地址,因此我定义一个int *t_array的指针,分配n个大小的int型空间,写法如下:

int * t_array;  //定义一维整型指针数组
t_array= (int *)malloc( sizeof(int) * n );  //分配4*n个字节的内存空间
free(t_array);  //内存空间不再用时,释放内存空间

2.申请二维空间

二维数组的数组名是其所有一维数组的首地址,因为二维数组的数组名是指针的指针,因为我定义一个row行column列的二维数组,写法如下:

int ** t_array;  //定义二维整型指针数组
int row;  //行序号
int column; //列序号
int i;
scanf("%d %d", row,column);  //输入行数,列数
t_array= (int **)malloc( sizeof(int *) * row);  //分配所有行的首地址 (分配的是行指针单元,每个单元的大小为 sizeof(int *) )
for(i=0;i
t_array[i]= (int *)malloc(sizeof(int) * column ); //再分配column个整数单元,上面的row个行指针指向这column个整数单元首地址
for(i=0;i
free(t_array[i]);
free(t_array)

这里摘出部分代码理解一下 int* returnSize 和 int** returnColumnSizes:

/**
 * Return an array of arrays of size *returnSize.
 * The sizes of the arrays are returned as *returnColumnSizes array.
 * Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
 */
 int** generateMatrix(int n, int* returnSize, int** returnColumnSizes){
    int** ret = (int **)malloc(sizeof(int*)*n); //准备n个一阶指针的空间,每个一阶指针可以指向一个数组
    *returnSize = n; //行数为n
    *returnColumnSizes = (int *)malloc(sizeof(int)*n);
    for (int i = 0; i < n; i++){
        ret[i] = (int *)malloc(sizeof(int)*n);
        memset(ret[i], 0, sizeof(int)*n); //数组初始化,相当于ret[]={0};
        //memset(首地址,值,sizeof(地址总大小));
        //memset:作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法。
        (*returnColumnSizes)[i] = n; //第i行的列数为n
    }
    return ret; //最后返回二维数组首地址
}
 

总结:malloc 一个数组,得到一个指向数组的一阶指针,main 函数传进来一个二阶指针指向你这个一阶指针,这样它就能找到你返回的列数组了。

Return an array of arrays of size *returnSize.
The sizes of the arrays are returned as *returnColumnSizes array.
Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().

详解:

returnSize 是一个指针, *returnSize 表示要返回的二维数组的行数。
returnColumnSizes是二阶指针, *returnColumnSizes 是一阶指针。returnColumnSizes 是一个数组,指针数组,用来装我们返回的二维数组每一行有多少个元素的(即列数)。
举个例子,利用malloc函数申请一个二维数组ret [[1,2,3,4],[5,6,7,8],[9,10,11,12]],array 表示最外侧括号的矩阵,arrays表示里面的几个小矩阵。

第一维的长度为 3,因此这里

int** ret = (int **)malloc(sizeof(int*)*3); //申请3个 int* 单元
*returnSize = 3

第二维的长度是一个一维数组[4,4,4],所以类型为 int *,因此这里 *returnColumnSizes = [4,4,4],也就是代码里的 for (i = 0; i < 3; i++) (*returnColumnSizes)[i] = 4;

*returnColumnSizes = (int *)malloc(sizeof(int)*3); //申请3个int单元
for (i = 0; i < 3; i++){
	ret[i] = (int *)malloc(sizeof(int)*4); //每个int单元里再申请4个int单元
	//memset(ret[i], 0, sizeof(int)*4);
	(*returnColumnSizes)[i] = 4;
}

C语言的二维数组申请
详解力扣中 int *return Size和 int **returnColumnSizes

心得

好像这下才真正理解malloc了

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值