刷题笔记:力扣第15、16题(排序+双指针)

力扣第15题-三数之和

1.拿到题目的第一想法还是遍历整个数组,找出所有的三个元素的组合,判断和是否为0,如果是0则计数器+1,将组合填入返回的数组中。

2.本题的开头有如下几句话:

①第一句话的意思是“返回一个数组的数组,这个二维数组的行数是*returnSize”,也就是说*returnSize就是组合计数器

②第二句话的意思是“每个子数组的列数通过*returnColumnSizes这个数组返回”,在本题中固定为3,在题目中应该表现为每当计数器+1时在计数器对应的编号位置下将数组元素赋值为3,具体代码实现如下:

1. (*returnColumnSizes)[*returnSize] = 3;

③第三句话的意思是“返回的二维数组、以及*returnColumnSizes这个数组,都必须通过malloc分配内存;调用者会负责调用 free 释放这些内存”,也就是说必须为返回的二维数组result以及储存二维数组result每行元素列数的数组分配足够大的空间(比如10000个元素大小的空间),具体代码实现如下:

1. int **result = (int**)malloc(10000 * sizeof(int*));;
2. *returnColumnSizes = (int*)malloc(10000 * sizeof(int));

3.对于如下代码:

1. (*returnColumnSizes)[*returnSize] = 3;
2. (*returnSize)++;

由于C语言中的运算优先级规则,*returnColumnSizes和*returnSize必须加括号,代码中出现的运算符的优先级如下表:

可以看到,如果不加括号,数组下标[]和++自增符会比*解引用符先执行,导致和预先想实现的效果不同。

4.初步写出的代码如下:

 1. /**
 2.  * Return an array of arrays of size *returnSize.
 3.  * The sizes of the arrays are returned as *returnColumnSizes array.
 4.  * Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
 5.  */
 6. int** threeSum(int* nums, int numsSize, int* returnSize, int** returnColumnSizes) {
 7.     int i, j, k;
 8.     *returnSize = 0;
 9.     int **result = (int**)malloc(10000 * sizeof(int*));;
10.     *returnColumnSizes = (int*)malloc(10000 * sizeof(int));
11.     for (i = 0; i < numsSize - 2; i++){
12.         for (j = i + 1; j < numsSize - 1; j++){
13.             for (k = j + 1; k < numsSize; k++){
14.                 if (nums[i] + nums[j] + nums[k] == 0){
15.                     (*returnColumnSizes)[*returnSize] = 3;
16.                     result[*returnSize] = (int*)malloc(3 * sizeof(int));
17.                     result[*returnSize][0] = nums[i];
18.                     result[*returnSize][1] = nums[j];
19.                     result[*returnSize][2] = nums[k];
20.                     (*returnSize)++;
21.                 }
22.             }
23.         }
24.     }
25.     return result;
26. }

三层f

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值