leetcode(力扣)第15题-三数之和---使用c语言双指针法,二级指针的应用

题目:

15. 三数之和 - 力扣(LeetCode)

编写过程的问题:

  1. 记住线索 1、对数组使用快排排序;2、固定 a 对 b、c 使用双指针;3、注意去重问题。
  2. 函数返回值的类型。{1,2,-3}。结果作为函数的返回值返回。二级指针的应用如下。理解二级指针花费了很长很长时间,并画了示意图。

3、记住快排的参数和用法。第三个参数是 sizeof(int)。

4、注意i 循环的边界。必须是 减2 而不是 减1。

5、注意 sum 应该放入到 内层循环里面。

c 语言给出的固定函数接口:

/** * 返回一个数组,该数组由多个子数组组成,每个子数组的大小为 *returnSize。 * 子数组的大小存储在 *returnColumnSizes 数组中。 * 注意:返回的数组和 *returnColumnSizes 数组都必须通过 malloc 分配内存, * 假设调用者会调用 free() 释放这些内存。 */

int** threeSum(int* nums, int numsSize, int* returnSize, int** returnColumnSizes) {

}

代码如下:

int cmp(const void *a, const void *b)
{
    return (*(int *)a - *(int *)b); 
}

int** three_sum(int *nums, int numsSize, int* returnSize, int** returnColumnSizes)
{
    int captital = 38000;
    int **result = (int **)malloc(captital * sizeof(int));
    int ret_num = 0;
    if(numsSize < 3)
    {
        *returnSize = 0;
        return result;
    }    
    
    qsort(nums, numsSize, sizeof(int), cmp);
    int i, left, right, sum;
    for(i = 0; i < numsSize -2; i++)
    {       
        if(i > 0 && nums[i] == nums[i -1])
            continue;

        left = i+1;
        right = numsSize -1;
        //sum = nums[i] + nums[left] + nums[right];
        while(left < right)
        {
            sum = nums[i] + nums[left] + nums[right];
            if(sum < 0)
            {
                left ++;
            }
            else if(sum > 0)
            {
                right --;   
            }
            else
            {
                result[ret_num] = (int *)malloc(sizeof(int) * 3);
                result[ret_num][0] = nums[i];
                result[ret_num][1] = nums[left];
                result[ret_num][2] = nums[right];
                
                while(left<right && nums[left] == nums[left+1])
                    left++;
                while(left<right && nums[right] == nums[right-1])                
                    right--;
                
                ret_num += 1;
                left ++;
                right --;
            }      
        }    
           
    }
    
    *returnColumnSizes = (int *)malloc(ret_num * sizeof(int));
    int j = 0;
    for(j = 0; j < ret_num; j++)
    {
        (*returnColumnSizes)[j] = 3;   
    }
    
    *returnSize = ret_num; 
    return result;      
}


int main()
{
    int i = 0;
    //int nums[] = {-1, 0, 1, 2, -1, -4};
    int nums[] = {1,-1,-1,0};
    //int nums[] = { 0, 0, 0 };
    //int nums[] = { 0, 1, 1 };
    int count = 0;
    int *returnColumnSizes;
    int **result = three_sum(nums, sizeof(nums)/sizeof(int), &count, &returnColumnSizes);
    
    if(count == 0)
        printf("[ ]\n");
    
    printf("["); 
    for(i = 0; i < count; i++)
    {
        printf("[%d,%d,%d]", result[i][0], result[i][1], result[i][2]);
        if(i != (count -1))
            printf(",");   
    }
    printf("]\n");
    return 0;
}

运行中出现的两个错误:

1、预期值出错:

原因是我将 sum = nums[i] + nums[left] + nums[right]; 放到了 while 循环的外面。应该放到 while 循环的里面。

2、报告的错误:Line 43: Char 33: runtime error: store to address 0x631001836140 with insufficient space for an object of type 'int *' [solution.c] 0x631001836140: note: pointer points here 20 60 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 是什么意思

也就是对应 result[ret_num] = (int *)malloc(sizeof(int) * 3); 出错,将 int captital = 38000; 的值修改更大后问题解决,通过全部的测试用例。

3、此处还没有搞懂 *returnColumnSizes = (int *)malloc(ret_num * sizeof(int));

必须注意的要点:

pixpin 没有 snipaste 聪明,下面的选项框被任务栏遮挡住了,snipaste 可以变到顶上去,而 pixpin 傻傻的被挡住,第二张图用的 snipaste 截图的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值