leetcode 三数之和

本文探讨了在给定整数数组中查找所有不重复的三元组,使其和为零的问题。通过递归算法检查可能的组合,并使用排序和计数机制避免重复结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。

注意:答案中不可以包含重复的三元组。

自己闲时实现了一份代码上传的时候一直报错,没找到什么原因,做个记录,以便交流学习。

int checkSum(int* nums, int numsSize, int mid, int left, int right, int* count, int *data)
{
    if(left < 0 || right >= numsSize){    
        return 0;
    }

    int value = nums[mid] + nums[left] + nums[right];
    if(value > 0){
        checkSum(nums, numsSize, mid, left-1, right, count, data);
    }
    
    if(value < 0){
        checkSum(nums, numsSize, mid, left, right+1, count, data);
    }
    
    if(value == 0){
        //printf("[%d, %d, %d] \n", nums[left], nums[mid], nums[right]);  
        if(*count < numsSize){
            data[ (*count)*3 + 0] = nums[left];
            data[ (*count)*3 + 1]  = nums[mid];
            data[ (*count)*3 + 2]  = nums[right];        
        }
        *count = *count + 1;
        
        return 0;
    }
    
    return 0;
}

/**
 * Return an array of arrays of size *returnSize.
 * The sizes of the arrays are returned as *returnColumnSizes array.
 * Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
 */
int** threeSum(int* nums, int numsSize, int* returnSize, int** returnColumnSizes)
{
    /*检验参数*/
    if(numsSize < 3 || !returnSize || !returnColumnSizes || !nums){
        return NULL;
    }
    
    /*特殊参数处理*/
    if(numsSize == 3){
        if((nums[0] + nums[1] + nums[2]) == 0){
            *returnSize = 1;
            *returnColumnSizes = malloc(numsSize*sizeof(int));
            memcpy(*returnColumnSizes, nums, numsSize*sizeof(int));
            return returnColumnSizes;
        }else{
            return NULL;
        }
    }
    
    int i = 0, j = 0;
    int *sortArray = malloc(numsSize*sizeof(int));    
    memcpy(sortArray, nums, numsSize*sizeof(int));

    /*排序*/
    for(i=0; i<numsSize; i++){
        for(j=i; j<numsSize; j++){
            if(sortArray[i] > sortArray[j]){
                int tmp = sortArray[i];
                sortArray[i] = sortArray[j];    
                sortArray[j] = tmp;
            }
        }
    }

    int count = 0;
    int *data = NULL;
    data = (int *)malloc(sizeof(int) * numsSize* 3);  //分配维数

    for(i=0; i<numsSize/2; i++){        
        checkSum(sortArray, numsSize, numsSize/2+i, numsSize/2-1+i, numsSize/2+1+i, &count, data);        
        checkSum(sortArray, numsSize, numsSize/2-i-1, numsSize/2-2-i, numsSize/2-i, &count, data);
    }
    

    free(sortArray);
    *returnSize = count;
    *returnColumnSizes = data;
    
    return data;    
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值