项目场景:
给你一个由 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]]
问题描述
这是一个四数之和的问题,要求四个数互不相同,原理上和三数之和是相同的,也是利用双指针。首先对数组排序,因为顺序无影响,当数组长度小于4直接return空列表, 之和i,j分别对应第一二个数的数组下标,各自循环开始时,此时数字如果和前一个数字相等直接continue,四数之和大于target直接break,代码中还有一些提升效率的代码以供观看。在while循环中,total小于target则left加一,大于则right加一,等于添加进列表。
class Solution:
def fourSum(self, nums: List[int], target: int) -> List[List[int]]:
list1=list()
if not nums or len(nums)<4:
return list1
nums.sort()
length=len(nums)
for i in range(length-3):
if i>0 and nums[i]==nums[i-1]:
continue
if nums[i]+nums[i+1]+nums[i+2]+nums[i+3]>target:
break
if nums[i]+nums[length-3]+nums[length-2]+nums[length-1]<target:
continue
for j in range(i+1,length-2):
if j>i+1 and nums[j]==nums[j-1]:
continue
if nums[i]+nums[j]+nums[j+1]+nums[j+2]>target:
break
if nums[i]+nums[j]+nums[length-2]+nums[length-1]<target:
continue
left,right=j+1,length-1
while left<right:
total=nums[i]+nums[j]+nums[left]+nums[right]
if total==target:
list1.append([nums[i],nums[j],nums[left],nums[right]])
while left<right and nums[left]==nums[left+1]:
left+=1
left+=1
while left<right and nums[right]==nums[right-1]:
right-=1
elif total<target:
left+=1
else:
right-=1
return list1
代码提交情况。
以上为本篇文章的全部内容,感谢你抽出宝贵的时间阅读这篇文章。如果你有任何疑问或建议,欢迎在评论区留言,我们一起交流进步。愿你的代码之路越走越顺,生活充满阳光!