题目描述
给你一个由 n 个整数组成的数组 nums 和一个目标值 target。
请你找出所有不重复的四元组 [a, b, c, d],使得 a + b + c + d == target。
答案中不能包含重复的四元组。
关键词:双指针、排序、四数之和、去重、剪枝优化 难度:中等
解题思路
本题是'三数之和'的扩展。核心思路如下:
- 排序:首先对数组进行升序排序,便于使用双指针和去重。
- 双重循环:固定前两个数
nums[i]和nums[j]。 - 双指针:在剩余区间内使用左右指针寻找后两个数,使四数之和等于
target。 - 去重与剪枝:跳过重复元素,并在和过大时提前结束循环。
代码实现
def fourSum(nums, target):
nums.sort()
res = []
n = len(nums)
for i in range(n - 3):
# 剪枝:如果当前最小和已大于 target,后续不可能满足
if nums[i] * 4 > target:
break
# 去重:跳过重复的 i
if i > 0 and nums[i] == nums[i - 1]:
continue
for j in range(i + 1, n - 2):
# 剪枝:如果当前最小和已大于 target
if nums[i] + nums[j] * 3 > target:
break
# 去重:跳过重复的 j
if j > i + 1 and nums[j] == nums[j - ]:
left, right = j + , n -
left < right:
total = nums[i] + nums[j] + nums[left] + nums[right]
total == target:
res.append([nums[i], nums[j], nums[left], nums[right]])
left < right nums[left] == nums[left + ]:
left +=
left < right nums[right] == nums[right - ]:
right -=
left +=
right -=
total < target:
left +=
:
right -=
res

