思路:(与三数之和类似,在外面加一层循环)
1. 先将 nums 按升序排序
2. 初始状态:k = 0,i = k+1,left = i+1,right = len(nums)-1
3. 进入第一层 for 循环:
如果 nums[k]>0 and target>0 and nums[k]>targrt 时,不存在满足条件的四元组。(剪枝)
如果 nums[k]==nums[k-1] and k>0 时,continue。(去重)
4. 进入第二层 for 循环:
如果 nums[i]==nums[i-1] and i>k+1 时,continue。(去重)
5. 进入第三层 while 循环:
当 left<right 时,计算 sum = nums[k]+nums[i]+nums[left]+nums[right],
如果 sum>target,right-=1;如果 sum<target,left+=1;否则说明 sum==target,符合题意,将此四元组加入res。
继续去重:如果 nums[left]==nums[left+1],left+=1;如果 nums[right]==nums[right-1],right-=1。
left+=1,right-=1
class Solution(object):
def fourSum(self, nums, target):
res = []
nums.sort()
for k in range(len(nums)):
if nums[k]>0 and target>0 and nums[k]>target:
break
if k>0 and nums[k]==nums[k-1]:
continue
for i in range(k+1,len(nums)):
if i>k+1 and nums[i]==nums[i-1]:
continue
left,right=i+1,len(nums)-1
while left<right:
sum = nums[k]+nums[i]+nums[left]+nums[right]
if sum>target:
right-=1
elif sum<target:
left+=1
else:
res.append([nums[k],nums[i],nums[left],nums[right]])
while left<right and nums[right]==nums[right-1]:
right-=1
while left<right and nums[left]==nums[left+1]:
left+=1
left+=1
right-=1
return res