https://leetcode-cn.com/problems/4sum/
给定一个包含 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]
]
前情提要:leetcode1.两数之和,leetcode15. 三数之和,leetcode16. 最接近的三数之和
class Solution:
def fourSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[List[int]]
"""
res, length = [], len(nums)
nums.sort()
for first in range(length-3):
if sum(nums[first:first+4]) > target:
break
if first != 0 and nums[first] == nums[first-1]:
continue
threesum = target-nums[first]
for second in range(first+1, length-2):
if sum(nums[second:second+3]) > threesum:
break
if second != first+1 and nums[second] == nums[second-1]:
continue
twosum = threesum-nums[second]
thrid, four = second + 1, length - 1
while thrid < four:
sum_two = nums[thrid]+nums[four]
if sum_two == twosum:
res.append([nums[first], nums[second], nums[thrid], nums[four]])
if sum_two >= twosum:
four -= 1
while thrid+1 < four and nums[four] == nums[four+1]:
four -= 1
if sum_two <= twosum:
thrid += 1
while thrid+1 < four and nums[thrid] == nums[thrid-1]:
thrid += 1
return res