• 【LeetCode】18. 四数之和


    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

    你可以按 任意顺序 返回答案 。

    示例 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]]

    2 答案

    自己写的,感觉没问题

    class Solution:
        def fourSum(self, nums: List[int], target: int) -> List[List[int]]:
            n = len(nums)
            res = []
            nums.sort()
            for i in range(n):
                if i>0 and nums[i]==nums[i-1]:
                    continue
                for j in range(i+1, n):
    
                    if j>1 and nums[j]==nums[j-1]:
                        continue
                    L = j+1
                    R = n-1
                    while L<R:
                        if nums[i]+nums[j]+nums[L]+nums[R]==target:
                            res.append([nums[i], nums[j], nums[L], nums[R]])
                        if L<R and nums[L] == nums[L+1]:
                            L+=1
                        if L<R and nums[R] == nums[R-1]:
                            R-=1
                        
                        if nums[i]+nums[j]+nums[L]+nums[R] > target:
                            R-=1
                        else:
                            L+=1
            return res
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    总是写错一些地方,修改后可以运行

    class Solution:
        def fourSum(self, nums: List[int], target: int) -> List[List[int]]:
            n = len(nums)
            res = []
            nums.sort()
            for i in range(n):
                if i>0 and nums[i]==nums[i-1]:
                    continue
                for j in range(i+1, n):
    
                    if j-i>1 and nums[j]==nums[j-1]:
                        continue
                    L = j+1
                    R = n-1
                    while L<R:
                        if nums[i]+nums[j]+nums[L]+nums[R]==target:
                            res.append([nums[i], nums[j], nums[L], nums[R]])
                            while L<R and nums[L] == nums[L+1]:
                                L+=1
                            while L<R and nums[R] == nums[R-1]:
                                R-=1
                            L+=1
                            R-=1
                        elif nums[i]+nums[j]+nums[L]+nums[R] > target:  # 必须elif
                            R-=1
                        else:
                            L+=1
            return res
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    官方解,加了许多优化和剪枝的方法

    class Solution:
        def fourSum(self, nums: List[int], target: int) -> List[List[int]]:
            n=len(nums)
            if(not nums or n<4):
                return []
            nums.sort()
            res=[]
            for i in range(n-3):
                if(nums[i]+nums[i+1]+nums[i+2]+nums[i+3]>target):  # 第一次遍历剪枝
                    break
                if(nums[i]+nums[-1]+nums[-2]+nums[-3]<target):  # 第一次遍历剪枝,nums[-1]这里-1是指n-1
                    continue
                if(i>0 and nums[i]==nums[i-1]):
                    continue
                for j in range(i+1,n-2):
                    if(nums[i]+nums[j]+nums[j+1]+nums[j+2]>target): # 第二次遍历剪枝
                        break
                    if(nums[i]+nums[j]+nums[-1]+nums[-2]<target):  # 第二次遍历剪枝
                        continue
                    if(j-i>1 and nums[j]==nums[j-1]):
                        continue
                    L=j+1
                    R=n-1
                    while(L<R):
                        if(nums[i]+nums[j]+nums[L]+nums[R]==target):
                            res.append([nums[i],nums[j],nums[L],nums[R]])
                            while(L<R and nums[L]==nums[L+1]):
                                L=L+1
                            while(L<R and nums[R]==nums[R-1]):
                                R=R-1
                            L=L+1
                            R=R-1
                        elif(nums[i]+nums[j]+nums[L]+nums[R]>target):
                            R=R-1
                        else:
                            L=L+1
            return res
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
  • 相关阅读:
    MySQL-树型结构数据查询
    spark内置数据类型
    elasticsearch DSL部分 源码解析
    JAVA在线课程教学大纲系统计算机毕业设计Mybatis+系统+数据库+调试部署
    第15章、 友元、异常和其他
    小程序制作(超详解!!!)第十五节 自动随机变化的三色旗
    二叉树题目:奇偶树
    51、前端代码单元测试怎么做?
    划分字母区间【贪心算法】
    25期代码随想录算法训练营第十天 | 栈与队列 part 2
  • 原文地址:https://blog.csdn.net/CSDNLHCC/article/details/133829078