概述
-
题目:给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (不重复指的是每个组合的唯一性)
-
类型:查找符合条件的四个数
-
思路:01-排序+两层for循环嵌套双指针的结构;02-循环和双指针中的去重;03-循环开始前以及每一层循环开始后有的剪枝;
-
经验:(1)查找最一般用for循环,找多个数就嵌套多个for循环。但是可以用排序、指针代替双重循环、剪枝三种技巧来简化多数查找。也就是说,最后的呈现结构是for里面嵌套双指针;(2)continue指的是跳出本次循环,break指的是跳出本层循环,return指的是跳出所有循环;(3)剪枝指的是遇到某种情况就跳出本次/本层/所有循环。剪枝的思路:整个循环开始前以及每一层循环之后都可以剪枝
a.空集或者长度不符合就直接输出空集
b.遍历过程中最左边四个>target,跳出本层循环(i层/j层)
c.遍历过程中最右边四个<target,跳出本次循环
(4)去重复:
a.for循环中:continue直到没有重复
b.双指针中:while直到没有重复
def fourSum(self, nums: List[int], target: int) -> List[List[int]]:
res=[]
if not nums or len(nums)<4:return res #剪枝
nums.sort()
if nums[0]+nums[1]+nums[2]+nums[3]>target:return res
if nums[len(nums)-1]+nums[len(nums)-2]+nums[len(nums)-3]+nums[len(nums)-4]<target:return res#循环前剪枝
for i in range(len(nums)-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[len(nums)-1]+nums[len(nums)-2]+nums[len(nums)-3]<target:continue#第一个数后剪枝
for j in range(i+1,len(nums)-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[len(nums)-2] + nums[len(nums)-1] < target:continue
left=j+1
right=len(nums)-1
while left<right:
if nums[i]+nums[j]+nums[left]+nums[right]==target:
res.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 nums[i]+nums[j]+nums[left]+nums[right]<target:left+=1
else:right-=1
return res
明日计划:
11. 盛最多水的容器:双指针
633. 平方数之和
最后
以上就是伶俐小白菜为你收集整理的leetcode每日一题【Day10】——18. 四数之和的全部内容,希望文章能够帮你解决leetcode每日一题【Day10】——18. 四数之和所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复