题目链接:15.3Sum
此题本不难,难就难在C里定义二维数组的分配空间难,首先要搞懂int* returnSize, int** returnColumnSizes是个啥。
returnColumnSize是一维数组的地址,一维数组里存的是二维数组res里每一个一维数组的长度。所以returnColumnSizes = (int **)malloc(sizeof(int) * basicSize);
returnColumnSizes 是一维数组的地址的地址
* returnColumnSizes 是一维数组的地址
(* returnColumnSizes)[i] 是一维数组的i个元素
(* returnColumnSizes)[i]这里的括号不能忘!!
要是还不懂就看别人的代码1。
别人的代码2+调试。
总结一下吧,以后要定义、操作二维数组就按下面的模板:(没调试过,可能要改)
int **myTemp(int *nums, int numsSize, int *returnSize, int **returnColumnSizes)
{
int **res;
int basicSize=8;
res = (int **)malloc(sizeof(int *) * basicSize);
*returnColumnSizes = (int **)malloc(sizeof(int) * basicSize);
for (i = 0; i < numsSize - 1; i++) {
res[i] = (int *)malloc(sizeof(int) * 3);
(*returnColumnSizes)[rstSize] = 3;//返回的数组里每个一维数组的长度都是3
rst[i][0] = 0;//your data
rst[i][1] = 1;
rst[i][2] = 2;
if (*returnSize == basicSize) {
basicSize *= 2;
res = (int **)realloc(res, sizeof(int *) * basicSize);
(*returnColumnSizes) = (int **)realloc((*returnColumnSizes),sizeof(int) * basicSize);
}
}
*returnSize = i;
return res;
}
这题还有个难点就是去重,稍不注意就数组越界,出现AddressSanitizer: heap-buffer-overflow报错(一般这种错误都是数组越界或者访问空指针)。
对左指针i去重的时候要用 if continue,不能用while i++。理由如上。debug太难了,这种低级 错误真的不能犯了,以后是会被骂死的T.T