题目一
题目描述
【力扣18.四数之和】
给你一个由 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]]
Python代码
class Solution:
def fourSum(self, nums: List[int], target: int) -> List[List[int]]:
nums.sort()
a = list()
n = len(nums)
for i in range(n):
for j in range(i+1,n):
right = n-1
for k in range(j+1,n):
while right>k and nums[i]+nums[j]+nums[k]+nums[right]>target:
right-=1
if right == k:
break
if nums[i]+nums[j]+nums[k]+nums[right]==target:
if [nums[i],nums[j],nums[k],nums[right]] not in a:
a.append([nums[i],nums[j],nums[k],nums[right]])
return a
解题小记
思路:与上一题三数之和的思路基本一致,都是利用双指针,有所不同的是因为是四个数字的和,本题需要再使用一层for循环,也是先进行排序,双指针分别指向后两位数,不断判断和与目标值的大小来移动左右指针,满足条件则查重后放入列表。
(时间复杂度有点高,有时间探索一下更省时的解法)
2022.11.22记