本人使用纯c刷leetcode时发现c的模板中经常出现int *returnSize和int **returnColumnSizes这两个参数,这实在是加大了c语言写题目的负担。
下面使用leetcode中的测试样例具象化这两个参数的作用,以及在leetcode中该如何赋值。
理解指针
int*p 相信大家都了解,p指针指向一块内存区域。这里用数组的视角和leetcode的测试样例解释。
int arr[]={1,2,3};
int *p=arr;
p = [1,2,3]
通俗的理解*p即只有一层方括号。
int arr[][1] = {{1,2}, {3,4}, {5,6}};
int **p = arr;
p = [
[1,2],
[3,4],
[5,6,7]
];
**p有两层方括号。
简单理解*returnSize
Return an array of arrays of size *returnSize
.这是leetcode的代码模板注解,字面意思就是用returnSize表示数组的大小,对于二维数组来说,returnSize就表示了二维数组的行数即内层方括号的个数,对于上述二维数组的例子,returnSize=3。
简单理解**returnColumnSizes
The sizes of the arrays are returned as *returnColumnSizes array.
数组的大小返回为returnColumnSizes。这里的数组其实是内层的数组,数组的大小其实就是二维数组每行的列数
对于上述数组,returnColumnSizes=[ [2,2,3] ];即第一行有2个元素,第二行有2个元素,第三行有3个元素。
leetcode中的赋值方法
这是题号77的函数
int** combine(int n, int k, int* returnSize, int** returnColumnSizes)
题目为
给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。
示例 1:
输入:n = 4, k = 2
输出:
[
[2,4],
[3,4],
[2,3],
[1,2],
[1,3],
[1,4],
]
示例 2:
输入:n = 1, k = 1
输出:[[1]]
对于returnSize只需要
*returnSize=0,然后按需累加
returnColumnSizes就稍微复杂一点,大多数题解都是直接这样写却没说为什么
*returnColumnSizes=malloc(resNum*sizeof(int));
for(int i=0;i<resNum;i++){
(*returnColumnSizes)[i]=k;;
}
第一行的malloc开辟了resNum个int大小的内存空间相当于[ [x,x,x] ]
(*returnColumnSizes)相当于returnColumnSizes[0]即取到第一个内层方括号的地址。
等价于
for(int i=0;i<resNum;i++){
returnColumnSizes[0][i]=k;
}
经过测试发现,leetcode中的这两个参数都是已经开辟过内存空间的了,但是具体是多少我们不知道。所以对于returnColumnSizes不需要malloc一个指针空间,leetcode已经开辟好了一个[ [null] ]空间。我们需要做的只是把内层括号中的空间开辟好。