哈希表|18.四数之和

int temp(const void* a1,const void*a2)
{
	return *(int*)a1 - *(int*)a2; //升序
}

int** fourSum(int* nums, int numsSize, int target, int* returnSize, int** returnColumnSizes){
    qsort(nums, numsSize, sizeof(int), temp);
    int base=48;
    int** ret=malloc(sizeof(int*)*base);
    *returnColumnSizes=(int*)malloc(sizeof(int)*base);
    *returnSize=0;
    int l,r;
    for(int i=0;i<numsSize;i++)
    {
        if(i>0&&nums[i]==nums[i-1])
        {
            continue;
        }
        for(int j=i+1;j<numsSize;j++)
        {
            if(j>i+1&&nums[j]==nums[j-1])
            {
                continue;
            }
            l=j+1;
            r=numsSize-1;
            while(l<r)
            {
                long sum=(long)nums[i]+(long)nums[j]+(long)nums[l]+(long)nums[r];
                if(sum==target)
                {
                    ret[(*returnSize)]=malloc(sizeof(int)*4);
                    (*returnColumnSizes)[(*returnSize)]=4;
                    ret[(*returnSize)][0]=nums[i];
                    ret[(*returnSize)][1]=nums[j];
                    ret[(*returnSize)][2]=nums[r];
                    ret[(*returnSize)][3]=nums[l];
                    (*returnSize)++;
                    if((*returnSize)==base)
                    {
                        base*=2;
                        ret=realloc(ret, sizeof(int*)*base);
                        *returnColumnSizes=(int*)realloc(*returnColumnSizes, sizeof(int)*base);
                    }
                    int num1=nums[l],num2=nums[r];
                    while(num1==nums[l]&&l<r)
                    {
                        l++;
                    }
                    while(num2==nums[r]&&l<r)
                    {
                        r--;
                    }
                }
                else if(sum>target)
                {
                    r--;
                }
                else 
                {
                    l++;
                }
            }

        }
    }
    return ret;
}

一、出错点

sorry,这题和上题一样让我懵逼

但是思路还是慢慢开始理解了

二、理解后的思路

四数之和,和15.三数之和 (opens new window)是一个思路,都是使用双指针法, 基本解法就是在15.三数之和 (opens new window)的基础上再套一层for循环。

但是有一些细节需要注意,例如: 不要判断nums[k] > target 就返回了,三数之和 可以通过 nums[i] > 0 就返回了,因为 0 已经是确定的数了,四数之和这道题目 target是任意值。比如:数组是[-4, -3, -2, -1]target-10,不能因为-4 > -10而跳过。但是我们依旧可以去做剪枝,逻辑变成nums[i] > target && (nums[i] >=0 || target >= 0)就可以了。

15.三数之和 (opens new window)的双指针解法是一层for循环num[i]为确定值,然后循环内有left和right下标作为双指针,找到nums[i] + nums[left] + nums[right] == 0。

四数之和的双指针解法是两层for循环nums[k] + nums[i]为确定值,依然是循环内有left和right下标作为双指针,找出nums[k] + nums[i] + nums[left] + nums[right] == target的情况,三数之和的时间复杂度是O(n^2),四数之和的时间复杂度是O(n^3) 。

那么一样的道理,五数之和、六数之和等等都采用这种解法。

对于15.三数之和 (opens new window)双指针法就是将原本暴力O(n^3)的解法,降为O(n^2)的解法,四数之和的双指针解法就是将原本暴力O(n^4)的解法,降为O(n^3)的解法。

之前我们讲过哈希表的经典题目:454.四数相加II (opens new window),相对于本题简单很多,因为本题是要求在一个集合中找出四个数相加等于target,同时四元组不能重复。

454.四数相加II (opens new window)是四个独立的数组,只要找到A[i] + B[j] + C[k] + D[l] = 0就可以,不用考虑有重复的四个元素相加等于0的情况,所以相对于本题还是简单了不少!

代码随想录 (programmercarl.com)

三、总结 

学会查阅资料,培养自己克服困难的能力。

然后多照着敲几次代码!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值