四数之和-双指针

本文详细介绍了如何运用双指针法解决LeetCode上的四数之和问题。通过排序输入数组,然后遍历数组并使用两个内部循环来寻找目标和,同时进行异常处理和重复值的避免,最终得到所有满足条件的不重复四元组。这种方法的时间复杂度为O(n^3)。
摘要由CSDN通过智能技术生成

四数之和-力扣

思路

  • 关键点:不重复的四元组、目标值target
  • 本题与三数之和类似,但是三数之和是0,本题是target,所以在对数组排序后,若num[i]>target,不能直接跳出循环,target可能是任意值;只有 num[i] > target and (nums[i]>=0 or target>=0 ),可以break.
  • 解题步骤:双指针法
    通过两个for循环nums[i]+nums[j]为确定值,循环内有left和right下标作为双指针,找到nums[i]+nums[j]+nums[left]+nums[right]==target,时间复杂度O(n^3)
class Solution:
    def fourSum(self, nums: List[int], target: int) -> List[List[int]]:
        n=len(nums)
        #异常处理
        if n < 4:
            return []
        res=[]
        #排序
        nums=sorted(nums)
        for i in range(n):
            #a+b+c+d=nums[i]+nums[j]+nums[left]+nums[right]=target
            #异常处理,减枝
            if nums[i] > target and (nums[i]>=0 or target>=0):
                break
            #a去重
            if i>0 and nums[i]==nums[i-1]:
                continue
            for j in range(i+1,n):
                left=j+1
                right=n-1
                #b去重
                if j > i+1 and nums[j]==nums[j-1]:
                    continue
                while left < right:
                    sum=nums[i]+nums[j]+nums[left]+nums[right]
                    if sum > target:
                        right-=1
                    elif sum < target:
                        left+=1
                    else:
                        res.append([nums[i],nums[j],nums[left],nums[right]])
                        #去重c和d
                        while left < right and nums[left]==nums[left+1]:
                            left+=1
                        while left < right and nums[right]==nums[right-1]:
                            right-=1
                        #左右指针移位
                        left+=1
                        right-=1
        return res

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值