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.
Examples:
Input: nums = [1, 0, -1, 0, -2, 2], and target = 0 Output: A solution set is:
classSolution: deffourSum(self, nums: List[int], target: int) -> List[List[int]]: n = len(nums) if n < 4: return [] nums.sort() res = [] for i in range(n-3): # 防止重复 数组进入 res if i > 0and nums[i] == nums[i-1]: continue # 当数组最小值和都大于target 跳出 if nums[i] + nums[i+1] + nums[i+2] + nums[i+3] > target: break # 当数组最大值和都小于target,说明i这个数还是太小,遍历下一个 if nums[i] + nums[n-1] + nums[n-2] + nums[n-3] < target: continue for j in range(i+1,n-2): # 防止重复 数组进入 res if j - i > 1and nums[j] == nums[j-1]: continue # 同理 if nums[i] + nums[j] + nums[j+1] + nums[j+2] > target: break # 同理 if nums[i] + nums[j] + nums[n-1] + nums[n-2] < target: continue # 双指针 left = j + 1 right = n - 1 while left < right: tmp = nums[i] + nums[j] + nums[left] + nums[right] if tmp == target: res.append([nums[i],nums[j],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 tmp > target: right -= 1 else: left += 1 return res