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: 'List[int]', target: 'int') -> 'List[List[int]]':
new_nums = sorted(nums)
res = []
for i in range(0, len(new_nums) - 3):
if new_nums[i] > target / 4:
return res
if i >= 1 and new_nums[i] == new_nums[i - 1]:
continue
for j in range(i + 1, len(nums) - 2):
if j > i + 1 and new_nums[j] == new_nums[j - 1]:
continue
if new_nums[i] + new_nums[j] > target / 2:
continue
k = j + 1
l = len(nums) - 1
while k < l:
if k >= j + 2 and new_nums[k] == new_nums[k - 1]:
k += 1
continue
if l <= len(nums) - 2 and new_nums[l] == new_nums[l + 1]:
l -= 1
continue
if new_nums[k] + new_nums[l] + new_nums[i] + new_nums[j]== target:
res.append([new_nums[i], new_nums[j], new_nums[k], new_nums[l]])
k += 1
elif new_nums[k] + new_nums[l] + new_nums[i] + new_nums[j] < target:
k += 1
elif new_nums[k] + new_nums[l] + new_nums[i] + new_nums[j] > target:
l -= 1
return res