描述
给一个包含n个数的整数数组S,在S中找到所有使得和为给定整数target的四元组(a, b, c, d)。
四元组(a, b, c, d)中,需要满足a <= b <= c <= d
答案中不可以包含重复的四元组。
您在真实的面试中是否遇到过这个题? 是
样例
例如,对于给定的整数数组S=[1, 0, -1, 0, -2, 2] 和 target=0. 满足要求的四元组集合为:
(-1, 0, 0, 1)
(-2, -1, 1, 2)
(-2, 0, 0, 2)
实现代码:
将问题分解,求四数之和分解成求三数之和,然后在分解成求两数之和。
class Solution:
res = set()
"""
@param numbers: Give an array
@param target: An integer
@return: Find all unique quadruplets in the array which gives the sum of zero
"""
def fourSum(self, numbers, target):
# write your code here
numbers.sort()
right = len(numbers) - 1
for a in range(len(numbers) - 3):
if a > 0 and numbers[a-1] == numbers[a]:
continue
left = a+1
self.threeSum(numbers, left, right, numbers[a], target)
return list(self.res)
def threeSum(self, numbers, left, right, first, target):
#b+c+d = target - a
target = target - first
for a in range(left, right+1):
if a>left and numbers[a] == numbers[a-1]:
continue
left = a + 1
self.towSum(numbers, left, right, first, numbers[a], target)
def towSum(self, numbers, left, right, first, second, target):
#c+d = target - b
target = target - second
while left < right:
if numbers[left] + numbers[right] == target:
self.res.add((first, second, numbers[left], numbers[right]))
left, right = left + 1, right - 1
while left < right and numbers[left] == numbers[left-1]:
left += 1
while left < right and numbers[right] == numbers[right+1]:
right -= 1
elif numbers[left]+numbers[right] < target:
left += 1
else:
right -= 1