python——lintcode58 · 四数之和

 描述

给一个包含n个数的整数数组S,在S中找到所有使得和为给定整数target的四元组(a, b, c, d)

四元组(a, b, c, d)中,需要满足a≤b≤c≤da≤b≤c≤d,答案中不可以包含重复的四元组。

样例

样例 1:

输入:

 
numbers = [2,7,11,15]
target = 3

输出:

 
[]

解释:

2 + 7 + 11 + 15 != 3,不存在满足条件的四元组。
样例 2:

输入:

 
numbers = [1,0,-1,0,-2,2]
target = 0

输出:

 
[[-1, 0, 0, 1],[-2, -1, 1, 2],[-2, 0, 0, 2]]

解释:

有3个不同的四元组满足四个数之和为0。

理论上这一题也是用双指针来做,两重循环+双指针,可以把O(n^4)的时间复杂度降低为O(n^3),不过我也用dfs写了一个,直接用搜索去做,虽然会超时但是提供一个思路:

from typing import (
    List,
)

class Solution:
    """
    @param numbers: Give an array
    @param target: An integer
    @return: Find all unique quadruplets in the array which gives the sum of zero
             we will sort your return value in output
    """
    def four_sum(self, numbers: List[int], target: int) -> List[List[int]]:
        # write your code here
        numbers=sorted(numbers)
        self.result=[]
        self.traversal=[0 for i in range(len(numbers))]

        def dfs(numbers,subset,target,index):
            if len(subset)==4 :
                if sum(subset)==target:
                    self.result.append(subset)
                    return
                else:
                    return
            for i in range(index,len(numbers)):
                if self.traversal[i]==1:
                    continue
                # if i!=index and numbers[i]==numbers[i-1] and self.traversal[i-1]==1:
                #
                #     continue
                self.traversal[i]=1
                dfs(numbers,subset+[numbers[i]],target,i+1)
                self.traversal[i]=0

        dfs(numbers,[],target,0)
        return self.result




numbers = [1,0,-1,0,-2,2]
target = 0
s = Solution()

print(s.four_sum(numbers,target))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哎呦不错的温jay

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值