题目描述:
给你一个由 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
你可以按 任意顺序 返回答案
输入输出示例:
思路:直接用好几层循环肯定会超时的,所以仍旧选择双指针,和三数不同的就是我们需要两层循环固定前两个数,为了避免重复,我们需要对数组进行排序,然后相邻的两个数字相同我们就移动指针或者是跳过这次循环,如果四个数和为target,我们右移left指针,左移right指针,如果大于target,因为我们是升序排序所以只需要左移right;如果小于target我们需要右移left指针。根据上述思路我们有以下代码:
class Solution:
def fourSum(self, nums: List[int], target: int) -> List[List[int]]:
#为了避免重复先对数组排序
nums.sort()
ans = []
#固定前两个数字,用左右指针确定后面两个数字
for i in range(0,len(nums)-3):
if i>0 and nums[i]==nums[i-1]:
continue
for j in range(i+1,len(nums)-2):
if j>i+1 and nums[j] == nums[j-1]:
continue
left,right = j+1,len(nums)-1
while left < right:
current_ans = nums[i]+nums[j]+nums[left]+nums[right]
if current_ans == target:
ans.append([nums[i],nums[j],nums[left],nums[right]])
while left < right and nums[left]==nums[left+1]:
left += 1
while left < right and nums[right]== nums[right-1]:
right -= 1
left += 1
right -= 1
elif current_ans > target:
right -= 1
else:
left += 1
return ans