Given an array nums
of n integers and an integer target
, are there elements a, b, c, and d in nums
such that a + b + c + d = target
? Find all unique quadruplets in the array which gives the sum of target
.
Note:
The solution set must not contain duplicate quadruplets.
Example:
Given array nums = [1, 0, -1, 0, -2, 2], and target = 0. A solution set is: [
[-1, 0, 0, 1],
[-2, -1, 1, 2],
[-2, 0, 0, 2]
]
class Solution: def fourSum(self, nums, target): def findNsum(nums, target, N, result, results): # early termination if len(nums) < N or N < 2 or target < nums[0] * N or target > nums[-1] * N: return # two pointers solve sorted 2-sum problem if N == 2: l = 0 r = len(nums) - 1 while l < r: s = nums[l] + nums[r] if s == target: results.append(result + [nums[l], nums[r]]) l += 1 while l < r and nums[l] == nums[l - 1]: l += 1 elif s < target: l += 1 else: r -= 1 while l < r and nums[r] == nums[r + 1]: r -= 1 # recursively reduce N else: for i in range(len(nums) - N + 1): if i == 0 or (i > 0 and nums[i - 1] != nums[i]): findNsum(nums[i + 1:], target - nums[i], N - 1, result + [nums[i]], results) results = [] findNsum(sorted(nums), target, 4, [], results) return results