• 【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
  • 相关阅读:
    【毕业设计】深度学习车牌识别系统 - python opencv 卷积神经网络
    软件架构设计
    单商户商城系统功能拆解20—售后订单
    自签名SSL证书的安全隐患和风险有哪些?
    前端搜索框防抖函数应用
    Pod详解
    Linux被控主机反弹shell给Cobalt_Strike(CS)-详细实战笔记
    C++各种字符转换
    RK3568开发板SG90 舵机模块的功能实现-迅为电子
    关于前端研发质量提升的建设思路
  • 原文地址:https://blog.csdn.net/CSDNLHCC/article/details/133829078