目录
1.题目描述
给你一个由 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
你可以按 任意顺序 返回答案 。
2.题目分析
这个题目的思路还是和之前的三数之和有共通之处的,今天试试用多指针的循环语句来实现吧,虽然因为循环的嵌套会导致速度降低,但是这种方法比较好想。
3.代码实现
from typing import List
class Solution:
def fourSum(self, nums: List[int], target: int) -> List[List[int]]:
# 初始化结果列表,没有结果就返回空列表
ans = []
if len(nums) < 4:
return ans
# 先对数组进行排序,以便后续去重和剪枝
nums.sort()
# 外层循环,控制两个数,内层循环也控制第三第四个数
for i in range(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
# 初始化内层循环的指针
k, l = j + 1, len(nums) - 1
# 内层循环
while k < l:
# 计算四个数的和
x = nums[i] + nums[j] + nums[k] + nums[l]
# 如果和小于目标值,移动较小的指针
if x < target:
k += 1
# 如果和大于目标值,移动较大的指针
elif x > target:
l -= 1
# 如果和等于目标值,添加到结果列表中,并跳过重复的元素
else:
ans.append([nums[i], nums[j], nums[k], nums[l]])
# 跳过重复的第三个数
while k < l and nums[k] == nums[k + 1]:
k += 1
# 跳过重复的第四个数
while k < l and nums[l] == nums[l - 1]:
l -= 1
# 继续寻找其他组合
k += 1
l -= 1
# 返回结果列表
return ans