18. 四数之和

文章介绍了两种使用Python解决四数之和问题的方法,主要依赖于数组排序和双指针技巧。第一种方法在找到可能的三数之和后,通过判断避免重复添加。第二种方法优化了这一过程,避免了使用`notin`进行重复检查,当指针移动时直接比较前一个元素来消除重复。
摘要由CSDN通过智能技术生成

题目描述

 方法:

1. 两重遍历+双指针

class Solution:
    def fourSum(self, nums: List[int], target: int) -> List[List[int]]:
        nums.sort()
        n = len(nums)
        res = []
        for i in range(n):
            for j in range(i+1, n):
                l = j+1
                r = n-1
                t = target - nums[i] - nums[j]
                while l < r:
                    if nums[l]+nums[r]>t:
                        r -= 1
                    elif nums[l]+nums[r]<t:
                        l += 1
                    else:
                        if [nums[i], nums[j], nums[l], nums[r]] not in res:
                            res.append([nums[i], nums[j], nums[l], nums[r]])
                        l += 1
                        r -= 1
        return res
                

2. 优化代码,不用not in判别(复杂度高),每次下标变化检查是否和上次相等

class Solution:
    def fourSum(self, nums: List[int], target: int) -> List[List[int]]:
        nums.sort()
        n = len(nums)
        res = []
        for i in range(n):
            if i > 0 and nums[i] == nums[i-1]:
                continue
            for j in range(i+1, n):
                if j>i+1 and nums[j] == nums[j-1]:
                    continue
                l = j+1
                r = n-1
                t = target - nums[i] - nums[j]
                while l < r:
                    if nums[l]+nums[r]>t:
                        r -= 1
                    elif nums[l]+nums[r]<t:
                        l += 1
                    else:
                        # if [nums[i], nums[j], nums[l], nums[r]] not in res:
                        #     res.append([nums[i], nums[j], nums[l], nums[r]])
                        res.append([nums[i], nums[j], nums[l], nums[r]])
                        while l < n:
                            l += 1
                            if not(l < n and nums[l] == nums[l-1]):
                                break
                        while r > j:
                            r -= 1
                            if not(r > j and nums[r] == nums[r+1]):
                                break
        return res

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值