Leetcode算法——18、四数之和

代码随想录算法训练营Day6 | Leetcode 454四数相加II、383赎金信、15三数之和、18四数之和 Leetcode454四数相加II、383赎金信、15三数之和、18四数之和解题思路与技巧、代码 阅读详情

题目

给定一个长度为n的整数数组,一个目标整数target。

在数组中找到4个数a,b,c,d,使得 a+b+c+d=target。

要求找到所有不重复的四元组合。

示例:

Given array nums = [1, 0, -1, 0, -2, 2], and target = 0.
A solution set is:
[
[-1, 0, 0, 1],
[-2, -1, 1, 2],
[-2, 0, 0, 2]
]

思路

1、三数之和+外层循环

在三数之和的双指针法的基础上,最外层再多嵌套一层循环即可。

四数之和的整体架构为:

  • 1、外面双层循环,代表四个数中的前两个数。
  • 2、里面为一首一尾双指针,代表四个数中的后两个数,双指针逐步往中间移动,直至相遇。

三数之和的双指针法详见Leetcode算法——15、三数求和。

2、改进版

改进的关键主要体现在循环之前先通过最小几个数相加和最大几个数相加判断是否有继续嵌套循环的必要。如果最小几个数相加都大于目标数,或者最大几个数相加都小于目标数,则可以直接跳过。

另外,可以将循环改为递归。使用递归是为了防止代码重复,否则第一层和第二层循环都要加上提前判断的代码。

使用递归的另一个好处是,可以不仅仅是4个数相加,任意大于等于3的数相加,都可以用这套代码。

python实现

def fourSum(nums, target):
    """
    :type nums: List[int]
    :type target: int
    :rtype: List[List[int]]
    在3Sum的基础上,多一层循环。
    """
    if len(nums) < 4:
        return []
    
    nums.sort()
    res = []
    
    for o in range(len(nums) - 3):
        if o > 0 and nums[o-1] == nums[o]: # 避免o重复
            continue
        for i in range(o + 1, len(nums) - 2):
            if i > o+1 and nums[i-1] == nums[i]: # 避免i重复
                continue
            l, r = i + 1, len(nums) - 1
            while l < r:
                s = nums[o] + nums[i] + nums[l] + nums[r]
                if s == target:
                    res.append([nums[o], nums[i], nums[l], nums[r]])
                    l += 1
                    r -= 1
                    while l < r and nums[l] == nums[l-1]: # 避免l重复
                        l += 1
                    while l < r and nums[r] == nums[r+1]: # 避免r重复
                        r -= 1
                elif s < target:
                    l += 1
                else:
                    r -= 1
    return res

def fourSum2(nums, target):
    """
    :type nums: List[int]
    :type target: int
    :rtype: List[List[int]]
    上述方法的改良版。
    """
    
    def findComb(nums, size, target, ans, start, ansSize, tempAns):
        '''
        递归函数。从nums的start下标开始往后,找到ansSize个整数,使得相加等于target。
        size为nums的大小,固定不变。
        ans存放最终答案。
        tempAns存放当前4元组内已经找到的元素,len(tmpAns)总是等于4-ansSize。
        '''
        if sum(nums[start:start+ansSize]) > target: # 最小的几个数相加都超出
            return
        if sum(nums[-ansSize:]) < target: # 最大的几个数相加都不够
            return
        if ansSize == 2: # 需要寻找2个,则使用首尾指针法。
            i = start
            j = size - 1
            while(i < j):
                sigma = nums[i] + nums[j]
                if sigma > target:
                    j -= 1
                elif sigma < target:
                    i += 1
                else:
                    ans.append(tempAns + [nums[i], nums[j]])
                    j -= 1
                    while(i < j and nums[j] == nums[j + 1]): # skip repeats
                        j -= 1
                    i += 1
                    while(i < j and nums[i] == nums[i - 1]): # skip repeats
                        i += 1
        else:
            for i in range(start, size - ansSize + 1):
                if i > start and nums[i] == nums[i - 1]: # skip repeats
                    continue
                findComb(nums, size, target - nums[i], ans, i + 1, ansSize - 1, tempAns + [nums[i]])
    
    ans = []
    size = len(nums)
    
    if size < 4:
        return []
    if size == 4:
        if sum(nums) == target:
            return [nums]
        else:
            return []

    nums.sort()

    findComb(nums, size, target, ans, 0, 4, [])
    return ans


if '__main__' == __name__:
    nums = [0, 0, 0, 0]
    target = 0
    print(fourSum2(nums, target))
【中等】力扣算法题解析LeetCode18:四数之和 该算法解决在数组中寻找不重复四元组使其和等于目标值的问题。通过排序数组后使用双重循环固定前两个数,结合双指针法查找后两个数,同时利用多层剪枝优化(跳过重复元素、提前终止无效分支)。使用long类型防止整数溢出,确保正确性。时间复杂度优化至O(n³),空间复杂度O(1)。代码通过5处剪枝和双指针技巧高效处理大规模数据,适用于长度≤200的数组,能正确处理大整数运算。 阅读详情

相关推荐

python【力扣LeetCode算法题库】18-四数之和

四数之和 给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等?找出所有满足条件且不重复的四元组。 注意: 答案中不可以包含重复的四元组。 示例: 给定数组 nums = [1, 0, -1, 0, -2, 2],和 target = 0。 满足要求的四元组集...

NJU phd 在读。 515

leetcode 18. 四数之和

四数之和题解集合排序+双指针回溯法哈希法总结 排序+双指针 建议大家先从三数之和的题解集合看起来,本方法题解基本是复制三数之和的双指针方法 思路: 两数之和呢,我们就先固定第一个数,然后移动指针去找第二个符合的,三数之和,固定一个数,双指针去找符合情况的其他两位数,那么我们四数之和,也可以先固定两个数,然后利用双指针去找另外两位数。所以我们来搞定他吧。 三数之和是,我们首先确定一个数,然后利用双指针去找另外的两个数,我们在这个题目里面的解题思路是需要首先确定两个数然后利用双指针去找另外两个数,和三数..

m0_53157173的博客 1220

ArcGIS将以大西洋居中的世界地图以中国居中显示

ArcGIS将以大西洋居中的世界地图以中国居中显示 并进行经纬度格网的调整输出

jiekeheiguanglan的博客 5705

算法练习-四数之和(思路+流程图+代码)

给定一个包含n个整数的数组nums和一个目标值target,判断nums中是否存在四个元素a,b,c和d,使得a+b+c+d的值与target相等?找出所有满足条件且不重复的四元组。 示例1: 输入:nums=[1,0,-1,0,-2,2]和target=0 输出:[[-1,0,0,1],[-2,-1,1,2],[-2,0,0,2]] 额外要求: ·答案中不可以包含重复的四元组

qq_54813250的博客 1802

从建模到调参:基于Simulink的两轮差速机器人轨迹跟踪PID控制全流程解析

本文详细解析了基于Simulink的两轮差速机器人轨迹跟踪PID控制全流程。从运动学建模入手,对比了基于距离与基于位置偏差的两种控制策略,并重点阐述了高精度轨迹跟踪的控制器设计、Simulink仿真搭建及PID参数整定方法,为移动机器人运动控制提供了完整的仿真实践指南。

weixin_29169505的博客 314

机器人学习-matlab四足机器人控制仿真

《机器人学,机器视觉与控制》学习笔记 使用工具箱版本9.10 题目与解决思路: 【1】. 通过减少复位期间的抬腿高度来缩短复位的轨迹 Z轴向下,为了减小复位器件的抬腿高度,应当缩小△Z,故可以将示例程序中zu值调大。 【2】. 增加腿的步幅 腿的步幅可由改变x方向上腿前进和后退运动的极限来达到,令xf = 7; xb = -xf;即可。 ...

weixin_44609769的博客 5539

LeetCode——四数之和

题目 给定一个包含n 个整数的数组nums和一个目标值target,判断nums中是否存在四个元素 a,b,c和 d,使得a + b + c + d的值与target相等?找出所有满足条件且不重复的四元组。 注意: 答案中不可以包含重复的四元组。 示例: 给定数组 nums = [1, 0, -1, 0, -2, 2],和 target = 0。 满足要求的四元组集合为: [ [-1,0, 0, 1], [-2, -1, 1, 2], [-2,0,...

YF_Li123的博客 801

MATLAB仿真实战:双有源桥(DAB)变换器的扩展移相调制(EPS)全流程解析

本文提供了一份详细的MATLAB/Simulink仿真实战指南,手把手解析双有源桥(DAB)变换器在扩展移相调制(EPS)下的全流程建模。内容涵盖从核心原理、主功率电路搭建、EPS驱动信号生成,到仿真运行、波形分析及模型优化的完整步骤,旨在帮助工程师和研究者快速掌握DAB变换器的仿真与性能验证方法。

o4p5q6r7s的博客 503

算法数据结构---四数之和

原因是该方法确实返回了一个ArrayList对象,但。本篇主要是在学习哈希表结构时,对一些习题的练习。,当向这个List中。该ArrayList。

丷江南南的博客 356

CosyVoice 本地部署详细教程 手把手小白教程

本文提供了详细的CosyVoice本地部署教程,强调了避免中文名称和空格的重要性,并列出了必要的软件安装步骤,包括CUDA、cuDNN、Git和Miniconda。教程涵盖了从检查CUDA版本到下载模型和运行模型的全过程,确保用户能够顺利部署并使用CosyVoice。

huazn612的博客 2万+

Image Sensor卷帘曝光(Rolling Shutter)基本原理以及对曝光行的通俗理解

由于CMOS sensor的曝光方式是一行一行的方式进行的,任何一个pixel的曝光时间是一样的,也就是同一行上的每个pixel的曝光开始点和曝光的时间都是一模一样的,所以同一行的所有点所接受到的能量是一样的,而在不同行之间虽然曝光时间都是一样的,但是曝光的开始点是不同的,所以不同行之间所接受到的能量是不一定相同的。至此完成了这一行的曝光。还是以桶装水为比喻: 排成一行的桶(桶的数量和每个桶的大小确定),每一曝光行为单位的时间内每一个桶加水都是一样,需要多少个曝光行才能使的所有水桶加起来的水达到1L。

大熊 3923

算法:四数之和(4sum)。

给定一个包含n 个整数的数组nums和一个目标值target,判断nums中是否存在四个元素 a,b,c和 d,使得a + b + c + d的值与target相等?找出所有满足条件且不重复的四元组。

孤芳不自赏 2172

CVE-2021-3156本地提权漏洞复现

受影响版本 sudo: 1.8.2 - 1.8.31p2 sudo: 1.9.0 - 1.9.5p1 测试 我这里是在本地centos7上进行测试。 需要目标机器上存在python编译器、目标主机出网或者能上传文件到目标主机。 以非root用户登录系统,并运行如下命令: sudoedit -s / 通常响应一个以 sudoedit: / 开头的报错,多半存在漏洞。 利用 提权脚本: https://www.o2oxy.cn/wp-content/uploa

The current road is different, love needs to distinguish between right and wrong 3780

【算法专题】双指针算法之18. 四数之和(力扣)

🏆本篇主题为:【算法专题】双指针算法之18. 四数之和(力扣)

cilmy23的note 1298

广义正态分布优化算法(GNDO)详解:从理论到实践

广义正态分布优化算法(GNDO)是一种基于正态分布理论的新型元启发式优化算法。该算法通过局部开发和全局探索两种策略平衡搜索过程:局部开发利用广义平均位置和标准差进行精细搜索,而全局探索通过随机个体信息共享扩大搜索范围。GNDO具有参数少、结构简单、收敛速度快等优点,在光伏模型参数提取等工程优化问题中表现优异。算法将种群位置更新与正态分布参数调整相联系,通过自适应机制平衡探索与开发,数学分析表明其具有全局收敛性。相比传统优化算法,GNDO在探索能力和开发能力上均有优势,是高维复杂优化问题的有效解决方案。

qq_42212808的博客 138

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

【力扣-算法】18.四数之和

我的想法很简单Integer装不下那就用Long来装,创建一个函数把在四数之和和target比较前把四数传参到judgeOverFlow方法中,在方法中设置两个变量,一个为long一个为int,再用两数进行比较返回boolean类型。只需把三数之和中的第一条件从三数之和必须等于0,变成四数之和必须等于target,在原来固定一个元素其他两个元素比较的基础上再固定一个数去用一个循环套住原来三数之和的就可以,其他两条件不变。但也会出现前四个是溢出了但后面有没溢出的还没进行判断就已经退出循环。

shi_r0_ha的博客 457

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

算法学习——LeetCode力扣哈希表篇2(454. 四数相加 II、383. 赎金信、15. 三数之和、18. 四数之和)

算法学习——LeetCode力扣哈希表篇2(454. 四数相加 II、383. 赎金信、15. 三数之和、18. 四数之和)

拉依达不拉跨的博客 1211

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

代码随想录算法训练营Day7(LeetCode454 四数相加II;LeetCode383 赎金信;LeetCode15 三数之和;LeetCode18 四数之和)

这道题非常有意思,正常计算三数之和直接对两个数字使用哈希表就好了,但是这里的数组是有重复的,因此不方便用哈希表来去做,而是要使用双指针。这道题由于和前面的三数之和一样返回数字,因此继续使用双指针法,但是后面几个测试用例让我错了很多次,这里讲一讲我错误的几个地方:①a和三数之和的第一个数一样需要。这道题是计算四个数相加的元组的个数,相加可以想到使用哈希表,因为就相当于在一组数中找刚刚数的相反数,由于需要统计符合条件的个数,因此需要使用。,后面就变成了三数之和的问题;,有两种方式:第一种是对前三个数组构造。

weixin_51001256的博客 820

07-算法训练营第七天 | 力扣454四数相加||、力扣383赎金信、力扣15三数之和、力扣18四数之和

07-算法训练营第七天 | 力扣454四数相加||、力扣383赎金信、力扣15三数之和、力扣18四数之和

huaxing_ba的博客 514

​leetcode算法题第18题:四数之和​

给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复):1. 0 ...

foolS22的博客 489

代码随想录算法训练营第七天 | LeetCode454四数相加2、383赎金信、15三数之和、18四数之和

454.四数相加2。

m0_57695537的博客 656

优选算法 力扣 18. 四数之和 双指针算法的进化 优化时间复杂度 C++ 题解 每日一题

本文围绕力扣 18 题 “四数之和” 展开解析。该题要求在整数数组中找出所有不重复的四元组,使其和等于目标值。核心解法是基于 “固定元素 + 双指针”,先排序数组,通过两层循环固定前两个元素,再用双指针寻找后两个元素,将问题转化为两数之和。文中详细拆解代码逻辑,包括排序预处理、四层去重机制(固定元素与双指针的去重)、整数溢出防护等关键环节,分析了时间复杂度(O (n³))和空间复杂度,并总结了常见坑点如溢出、去重时机错误等,还指出其对解决多数之和问题的借鉴意义。

Q741_147的博客 1012

【力扣算法】18-四数之和

题目 给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a, b,c 和 d ,使得 a + b + c + d 的值与 target 相等?找出所有满足条件且不重复的四元组。 注意: 答案中不可以包含重复的四元组。 示例: 给定数组 nums = [1, 0, -1, 0, -2, 2],和 target = 0。 满足要求的四元组集合为...

ZeromaXHe的博客 669

代码随想录算法训练营第七天|LeetCode 454 四数相加ll、LeetCode383 赎金信、LeetCode15 三数之和、LeetCode18 四数之和

之前的两数之和是在一个数组列表内找两个数之和=target。

weixin_46078957的博客 397

【算法刷题day7】Leetcode:454. 四数相加 II、383. 赎金信、15. 三数之和、18. 四数之和

暂无这题可以用Hash数组来解决暂无要想到和三数之和是一个道理454. 四数相加 II代码随想录解析383. 赎金信代码随想录解析15. 三数之和代码随想录解析18. 四数之和代码随想录解析。

qq_45022758的博客 423

★ 算法OJ题 ★ 力扣18 - 四数之和

★ 算法OJ题 ★ 力扣18 - 四数之和

2302_80328146的博客 1086
上一篇: Leetcode算法——17、电话号码的字符组合
下一篇: Leetcode算法——19、删除倒数第n个节点
HappyRocking
博客等级 码龄12年 222粉丝 176原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值