leetcode 15. 3Sum (C)

题目链接: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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值