leetcode每日一题【Day10】——18. 四数之和

  • 题目:给你一个由 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.遍历过程中最右边四个 (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,算法,python)