力扣第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

498

被折叠的 条评论
为什么被折叠?



