给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复):
0 <= a, b, c, d < n
a、b、c 和 d 互不相同
nums[a] + nums[b] + nums[c] + nums[d] == target
你可以按 任意顺序 返回答案 。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/4sum
例:
输入:nums = [1,0,-1,0,-2,2], target = 0 输出:[[-2,-1,1,2],[-2,0,0,2],[-1,0,0,1]]
解析:四数之和大致和三数之和相同,在三数之和外层多套一层即可。为了避免重复,需要对相同的值进行判定。最外层大循环,内层双指针,然后指针中间便利对比判断。
class Solution(object):
def fourSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[List[int]]
"""
nums.sort() # 排序
n = len(nums) # 长度
res = [] # 初始化结果
for i in range(n): # 最外层
if i > 0 and nums[i] == nums[i - 1]: continue # 排除重复
for k in range(i+1, n): # 第二个值
if k > i + 1 and nums[k] == nums[k-1]: continue
p = k + 1 # 第三个值
q = n - 1 # 第四个值
while p < q:
if nums[i] + nums[k] + nums[p] + nums[q] > target: q -= 1
elif nums[i] + nums[k] + nums[p] + nums[q] < target: p += 1
else:
res.append([nums[i], nums[k], nums[p], nums[q]])
while p < q and nums[p] == nums[p + 1]: p += 1 # 去重
while p < q and nums[q] == nums[q - 1]: q -= 1 # 去重
p += 1
q -= 1
return res