题目描述:
给你一个由 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 可以按 任意顺序 返回答案 。
示例
1)输入:nums = [1,0,-1,0,-2,2], target = 0
输出:[[-2,-1,1,2],[-2,0,0,2],[-1,0,0,1]]
2)输入:nums = [2,2,2,2,2], target = 8
输出:[[2,2,2,2]]
思路
与15题三数之和相同,三数之和的方法都可以应用在这个问题上。
这里主要是要双指针的方式:
class Solution(object):
def fourSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[List[int]]
"""
result = []
s = sorted(nums) # 从小到大排序
for j in range(len(s)-3):
if j == 0 or s[j] != s[j - 1]:
for i in range(j + 1, len(s)-2):
if i == j+1 or s[i] != s[i - 1]:
left = i + 1
right = len(s) - 1
while left < right:
if s[left] + s[right] + s[j] + s[i] > target:
right = right - 1
elif s[left] + s[right] + s[j] + s[i] == target:
result.append([s[i], s[left], s[right], s[j]])
while left + 1 < len(s) and s[left] == s[left + 1]:
left = left + 1
while right - 1 >= 0 and s[right] == s[right - 1]:
right = right - 1
left = left + 1
right = right - 1
else:
left = left + 1
return result
双指针的方式是很重要的!!!
可以对应15题中使用set的方式来练习一下使用hash表完成本题目。