leetcode 4Sums

本文分享了一种解决“四数之和”问题的高效算法,通过对原始算法进行优化,实现了时间复杂度的有效降低。文章详细介绍了算法的实现过程,包括如何避免重复解和如何通过条件判断提前终止循环,从而提高算法效率。

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

只能说这题绝妙,亦或是我解法较笨

class Solution {

    public List<List<Integer>> fourSum(int[] nums,int target) {
        List<List<Integer>> ans=new ArrayList<>();
        int size=nums.length;
        if(size<4)
        return ans;
        Arrays.sort(nums);
        for(int i=0;i<nums.length-3;i++)
        {
           int flag1=nums[i];
           if(i>0&&nums[i]==nums[i-1])continue;
           //if(flag1>target)return ans;
           for(int j=i+1;j<nums.length-2;j++)
           {
                int flag2=nums[j];
                if(j>i+1&&nums[j]==nums[j-1])continue;
                ///if(flag1+flag2>target)break;
                int l=j+1;
                int r=nums.length-1;
                while(l<r){
                    int temp=flag1+flag2+nums[l]+nums[r];
                    if(temp==target){
                    ans.add(Arrays.asList(flag1,flag2,nums[l],nums[r]));
                    while(l<r&&nums[l]==nums[l+1])
                    l++;
                    while(l<r&&nums[r]==nums[r-1])
                    r--;
                    l++;
                    r--;
                    }
                    else if(temp>target)
                    r--;
                    else
                    l++;
                }
           }
        }
        return ans;
    }
}

这中间每一次错误都是一个巨坑

在这里插入图片描述
今早走在路上又想到一点优化方法,时间减少1/3

class Solution {

    public List<List<Integer>> fourSum(int[] nums,int target) {
        List<List<Integer>> ans=new ArrayList<>();
        int size=nums.length;
        if(size<4)
        return ans;
        Arrays.sort(nums);
        for(int i=0;i<nums.length-3;i++)
        {
           int flag1=nums[i];
           if(i>0&&nums[i]==nums[i-1])continue;
           if(flag1>target/4)return ans;
           for(int j=i+1;j<nums.length-2;j++)
           {
                int flag2=nums[j];
                if(j>i+1&&nums[j]==nums[j-1])continue;
                //if(flag1+flag2>target)break;
                //上面是仿照3数之和写的,错误,因为那个0是0/2和0/3
                if(flag1+flag2>target/2)break;
                //排序后两数大于目标一半,后面再加两一定大于目标
                int l=j+1;
                int r=nums.length-1;
                while(l<r){
                    if(flag1+flag2+nums[l]>3*target/4)break;
                    int temp=flag1+flag2+nums[l]+nums[r];
                    if(temp==target){
                    ans.add(Arrays.asList(flag1,flag2,nums[l],nums[r]));
                    while(l<r&&nums[l]==nums[l+1])
                    l++;
                    while(l<r&&nums[r]==nums[r-1])
                    r--;
                    l++;
                    r--;
                    }
                    else if(temp>target)
                    r--;
                    else
                    l++;
                }
           }
        }
        return ans;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值