给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等?找出所有满足条件且不重复的四元组。
注意:
答案中不可以包含重复的四元组。
示例:
给定数组 nums = [1, 0, -1, 0, -2, 2],和 target = 0。
满足要求的四元组集合为:
[
[-1, 0, 0, 1],
[-2, -1, 1, 2],
[-2, 0, 0, 2]
]
class Solution:
def fourSum(self, nums: List[int], target: int) -> List[List[int]]:
# 递归
if len(nums) < 4:
return []
nums.sort()
return self.nSum(nums, 4, target)
def nSum(self, nums, n, target):
"""注意,此函数的nums应是排序后的数组,否则每层递归都要对nums排序,效率极低"""
if len(nums) < n:
return []
res = []
if n == 2:
left, right = 0, len(nums)-1
while left < right:
if nums[left] + nums[right] == target:
res.append([nums[left], nums[right]])
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
elif nums[left] + nums[right] > target:
right -= 1
else:
left += 1
return res
else:
for first_idx in range(len(nums)):
if first_idx > 0 and nums[first_idx] == nums[first_idx-1]:
continue
subres = self.nSum(nums[first_idx+1:], n-1, target-nums[first_idx])
for i in range(len(subres)):
res.append([nums[first_idx]] + subres[i])
return res