描述
给一个包含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))