Leetcode(15)三数之和——双指针碰撞

三数之和算法解析:双指针优化与面试实战 双指针算法是解决数组类问题的经典技术,通过将时间复杂度从O(n³)优化至O(n²)显著提升计算效率。其核心原理是在排序后的数组中,利用左右指针的协同移动快速定位目标组合,这种思想在解决两数之和、三数之和等系列问题时尤为高效。在工程实践中,该算法广泛应用于金融风控异常检测、游戏物理引擎优化等场景。针对LeetCode高频面试题三数之和问题,通过排序预处理+双指针的黄金组合,配合智能去重和边界处理,能够有效解决结果重复和计算爆炸等核心挑战。本文详解的解法在Meta、Google等大厂面试中出现超过2000次,是 阅读详情

题目描述
给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。

注意:答案中不可以包含重复的三元组。

  • 例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4],

    满足要求的三元组集合为:
    [
    [-1, 0, 1],
    [-1, -1, 2]
    ]

思路

这道题不算太难,比较麻烦的是细节的处理,比如不能有重复,边界条件的设置等。
如果考虑两数之和的问题,可以用哈希表达到快速取,三个数的解法有点类似快排,数组排序后,取一个数作为target,设置两个指针从头尾走,其和为0时放入答案数组,和小于0说明左边的数取的太小了,所以左边向右移动;和大于0说明右边取得太大了,右边向左移动。
重点是合适的剪纸

代码
class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        sort(nums.begin(),nums.end() );
        vector<vector<int>> res;
        if(nums.empty()  || nums.front() > 0 || nums.back() < 0)return {};     //最小的数大于0或者最大的数小于0,不可能出现和为0的情况
        for(int k = 0; k < nums.size();++k){
             //nums[k]>0时,其后全为正数,和不会为0,退出
            if(nums[k] > 0)break;   
            //重复数字跳过
            if(k > 0 && nums[k] == nums[k - 1])continue;     
            int target = 0 - nums[k];
            int i = k + 1,j = nums.size() - 1;
            while(i < j){
                if(nums[i] + nums[j] == target){
                    res.push_back({nums[k],nums[i],nums[j]});
                    //重复数字跳过
                    while(i < j && nums[i] == nums[i + 1])  ++i;
                    while(i < j && nums[j] == nums[j - 1]) --j;
                    ++i;--j;

                }
                else if(nums[i] + nums[j] < target) ++i;
                else --j;
            }
        }
        return res;
    }
};
即插即用!5分钟为你的SNN模型添加频谱注意力(DCT-SA模块实战) 本文介绍了如何为脉冲神经网络(SNN)快速集成即插即用的DCT-SA频谱注意力模块。该模块利用离散余弦变换(DCT)在频率域自适应加权特征,能有效提升模型对纹理、边缘的感知能力,并在CIFAR10-DVS等数据集上实现分类精度提升与脉冲发放率下降。文章以SpikingJelly框架和ResNet19为例,提供了详细的代码实现、集成步骤及参数调优实战指南。 阅读详情

相关推荐

Vivado ChipScope Debugging: Overcoming Common DRC Errors in FPGA Design

本文深入解析Vivado ChipScope调试中常见的DRC错误,特别是AVAL-244和AVAL-245等时钟相关问题,提供实用的Tcl命令解决方案和最佳实践。通过将DRC错误降级为警告的技巧,帮助FPGA设计者高效完成调试流程,同时强调何时应保留DRC检查以确保设计可靠性。

weixin_30335575的博客 416

双指针——四数之和

题目中也要求不重复,与三数之和的重复判定一样,只要四元组中元素相同就算重复。对于三数之和,我们先固定一个数b,然后在剩下的区间内借助双指针算法,找出两个数和为target-a-b的二元组即可。我们先固定一个数a,然后就是在剩下的区间内找出三个数之和为target-a的三元组,这不就是三数之和么。需要注意的是,这里在计算newTarget时有可能会数据溢出,所以要进行类型转换,避免溢出。2、去重,在a、b、以及left和right的选取都要避免选取重复值,同时也要避免越界。这里的解决办法和三数之和是一样的。

xsc2004zyj的博客 363

绑定压力的计算方法

压强的公式为P=F/S,其中P为ACF要求的本压压强范围,S为受压面积,F为本压压头施加的力。绑定参数需要按线体按压头进行DOE确认,并使用DOE确认好的参数按压头重新绑定标识好送ACF厂商实测固化率、粒子变形的情况,避免绑定参数导致的异常,在绑定参数的设定过程中温度和时间可以使用仪器实测但绑定的压力则需要换算。工程上绑定压力换算的原则是:1、FPC属于柔性物料,柔性物料的受压面积按FPC绑定的受压面积=FPC绑定的长度。一、工程上FOG FPC本压压力换算(柔性材料以挤压的接触面积=受力面积)F=P。

weixin_53757859的博客 1532

哈希表(双指针)-四数之和

题目 https://leetcode-cn.com/problems/4sum/ 思路 四数之和与三数之和是一个思路,都是使用双指针法, 基本解法就是在三数之和 的基础上再套一层for循环。 但是有一些细节需要注意,例如: 不要判断nums[k] > target 就返回了,三数之和 可以通过 nums[i] > 0 就返回了,因为 0 已经是确定的数了,四数之和这道题目 target是任意值。比如下图的情况: 三数之和的双指针解法是一层for循环num[i]为确定值,然后循环内有left

jsdoulaoula的博客 200

kettle信息发送钉钉

由于其他的作业比较多,想要在job中加入一个转化发送消息到钉钉,其他的配置说明直接获取系统的信息。这样也避免直接修改其他的转换和大量的工作量。 步骤: 1、新建一个转换 拉取获取系统信息、获取变量、JavaScript代码、获取access_token组件。 2、获取系统信息设置 拿到需要的信息,比如作业的读写更新删除行数,job的日志内容 这个日志内容同在作业执行页面下输出的日志,所以可以在执行作业时选择是详细日志、基本日志还是错误日志。 3、获取变量 获取变量主要是想要去拿到job的名称,文件名。按

Deng_7788的博客 1445

YOLOv8与UNetV2融合:一种面向目标检测与图像分割的混合方法【附核心代码】

我们提出了一种基于YOLOv8和UNetV2相结合的混合架构。该架构利用YOLOv8作为主干进行目标检测,同时在YOLOv8的特征提取过程中,引入UNetV2来进行图像分割任务的增强。在该架构中,YOLOv8负责大范围目标检测和位置预测,而UNetV2则在检测网络的特征图基础上,通过其高效的上下文信息提取和细节恢复能力,进一步优化分割任务。在本文中,我们提出了一种改进YOLOv8的方法,通过引入图像分割网络UNetV2来提高图像分割检测性能。

一键难忘的博客 3524

LeetCode 15 三数之和(双指针)

15.三数之和 给定一个包含n个整数的数组S,是否存在属于S的三个元素a,b,c使得a + b + c =0 ?找出所有不重复的三个元素组合使三个数的和为零。 注意:结果不能包括重复的三个数的组合。 例如, 给定数组 S = [-1, 0, 1, 2, -1, -4], 一个结果集合为: [ [-1, 0, 1], [-1, -1, 2] ] ps:这题可以...

锦瑟年华,逐梦之人 2056

ADS基础教程19 - 电磁仿真(EM)基本概念和实操

一、引言二、基本概念1.EM介绍2.Momentum介绍3.FEM介绍4.Substrate介绍三、创建Layout并进行Momentum仿真1.创建Layout2.添加Microtrip(微带线)3.添加Substrate4.Momentum仿真四、总结EM全称Electromagnetic,即electro(电)magnetic(磁)。ADS为设计和评估现代通信系统产品提供了电磁仿真工具(EM)。EM包括Momentumsimulator(动量仿真器)和FEM。

XZ_ZC的博客 1万+

四数之和——双指针的实践

参考: https://leetcode-cn.com/problems/4sum/solution/si-shu-zhi-he-by-leetcode-solution/ https://leetcode-cn.com/problems/3sum-closest/ https://leetcode-cn.com/problems/3sum/solution/15-san-shu-zhi-he-ha-xi-fa-shuang-zhi-zhen-fa-xi-2/

sinat_31608641的博客 384

设备接入与APP(应用程序)接入华为云iotDA平台的详细操作步骤及获取方式

设备及APP(应用程序) 登录 IoTDA 平台所需的 入场与操作清单内容,提供逐项详细操作步骤和获取方式,并穿插贴士便于理解与实际操作落地。内容基于 华为云 IoTDA 控制台 和 IAM 控制台 的实际使用路径整理。

hy行者勇哥的博客 3058

C#与欧姆龙PLC 通信——fins udp协议

该调试助手专门为了帮助大家学习以及测试Fins-Udp通信,下面进行详细介绍。

qq_34059233的博客 2871

C++算法;最接近的三数之和---两头堵模型(对撞指针)

题目: 给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。 例如: 给定数组 nums = [-1,2,1,-4], 和 target = 1。 与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2). 思路: 1.排序: 2.特殊情况...

ZHAO 427

Linux C/C++ or 嵌入式面试之《C/C++笔面试系列》(10) C++ 前置后置增减运算符重载形式与比较

C语言的++、–运算符在此不讨论。 文章目录1、前置后置增减运算符重载的形式2、前置和后置运算符的性能比较 1、前置后置增减运算符重载的形式 自增运算符“++”和自减运算符“–”分别包含两个版本。即运算符前置形式(如 ++x)和运算符后置形式(如 x++),这两者进行的操作是不一样的。因此,当我们在对这两个运算符进行重载时,就必须区分前置和后置形式。C++根据参数的个数来区分前置和后置形式。如果按照通常的方法来重载 ++ 运算符(即作为成员函数重载时不带参数,或者作为非成员函数重载时带有一个参数),那么重载

二进制君 5829

指针 是否相同_七十三、从三数之和探究双指针思想

「@Author:Runsen」编程的本质来源于算法,而算法的本质来源于数学,编程只不过将数学题进行代码化。「---- Runsen」双指针双指针是一种解决问题的技巧或者思维方式,指在访问一个序列中的数据时使用两个指针进行扫描,两个指针可以是同向的,也可以是反向的。我们的关注点可以是这两个指针指向的两个元素本身,也可以是两个指针中间的区域。二分法的思想基于这种左右指针的实现。双指针是一种...

weixin_34567845的博客 229

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

代码随想录day 7:哈希表02(四数相加2,赎金信,三数之和,四数之和,总结)

一般来说哈希表都是用来快速判断一个元素是否出现集合里。对于哈希表,要知道哈希函数和哈希碰撞在哈希表中的作用。哈希函数是把传入的key映射到符号表的索引上。哈希碰撞处理有多个key映射到相同索引上时的情景,处理碰撞的普遍方式是拉链法和线性探测法。数组set(集合)map(映射)在C++语言中,set 和 map 都分别提供了三种数据结构,每种数据结构的底层实现和用途都有所不同,在关于哈希表,你该了解这些!中我给出了详细分析,这一知识点很重要!

weixin_61013372的博客 1112

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

七十三、从三数之和探究双指针思想

双指针是一种解决问题的技巧或者思维方式,指在访问一个序列中的数据时使用两个指针进行扫描,两个指针可以是同向的,也可以是反向的。

微信号:RunsenLiu 1395

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

[LeetCode] 15.三数之和(Medium)C语言题解

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

wjy的博客 1893

LeetCode15.三数之和

给你一个包含 n 个整数的数组nums,判断nums中是否存在三个元素 a,b,c ,使得a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。 注意:答案中不可以包含重复的三元组。 示例: 给定数组 nums = [-1, 0, 1, 2, -1, -4], 满足要求的三元组集合为: [ [-1, 0, 1], [-1, -1, 2] ] import java.util.*; /** * @author mac * @date 2020/11/5-2...

小明的Java问道之路 934

15三数之和

b+树和其他的类型对比:首先二叉树那种因为只有两个子节点就会导致层数很高查询效率变慢,再看b树这个和b+树的区别就是是不是只有叶子节点才存储值,这就导致相同高度b+树能存更多的键,把树的高度降下来查询效率就变快,和哈希对比,哈希不支持范围查询和匹配。索引的底层结构是b+树可以有多个子节点,非叶子节点存储键,叶子节点存值,树的高度决定了查询的效率,几层就查几次,既保证查询效率还支持范围操作。红黑树的优点: 完全平衡树为了保证完全平衡的调整时间花费太大了,红黑树保持不完全平衡的前提下查找效率也不低,效率就高。

2403_86391704的博客 447

三数之和算法解析:双指针优化与面试技巧

在算法面试中,双指针技术是解决数组类问题的核心方法之一,尤其适用于需要高效遍历或多重条件判断的场景。其基本原理是通过两个指针的协同移动,将原本O(n²)或O(n³)的时间复杂度优化至O(n)或O(nlogn)。三数之和问题正是这一技术的经典应用,通过排序预处理结合双指针扫描,既能有效降低时间复杂度,又能优雅处理去重逻辑。该算法在金融风控、游戏开发等工程领域有广泛应用,如异常交易检测和碰撞检测优化。掌握这类高频面试题(如LeetCode 15)的解法,不仅能提升算法能力,还能加深对时间空间复杂度优化的理解。

weixin_30718391的博客 396

[LeetCode #15] 三数之和

不同的三元组是 [-1,0,1] 和 [-1,-1,2]。注意,输出的顺序和三元组的顺序并不重要。答案中不可以包含重复的三元组。唯一可能的三元组和不为 0。唯一可能的三元组和为 0。,判断是否存在三元组。

weixin_65043441的博客 488

C语言每日一题(66)三数之和

4.为了避免出现重复结果,我们之前已经对数组进行了排序,假设此时left和right指向的值的和满足条件,又因为排序后连续的数会放到一起,所以left后面和right前面就会存在重复元素,此时我们需要跳过它,同时也要避免left>right,因为前面匹配后lefti已经移动了一次,如果用left后面的值当作判断的话,可能left的下一个元素是新元素,而此时left还在重复元素上,所以要有left前面的值进行判断,right也是一样,反过来就行。不同的三元组是 [-1,0,1] 和 [-1,-1,2]。

wcl312的博客 975

leetcode:16. 最接近的三数之和

题目来源 leetcode:3sum-closest/submissions 题目描述 题目解析 思路和leetcode:15. 三数之和一致。 首先考虑枚举第一个元素 a,对于剩下的两个元素 b 和 c,我们希望它们的和最接近 $target−a$。因为此时b + c在数组中范围是没有任何规律的,所以我们只能有一个双重循环来枚举所有的可能情况。因此,我们可以考虑先对数据进行升序排序,这样: 假设数组的长度为n,我们先枚举a,它在数组中的位置为i 为了防止重复枚举,我们在位置[i+1,n)[i +1

OceanStar的博客 273

算法训练营打卡Day7 | 454.四数相加II 383. 赎金信 15. 三数之和 18. 四数之和 哈希表总结

一般来说哈希表都是用来快速判断一个元素是否出现集合里。对于哈希表,要知道哈希函数和哈希碰撞在哈希表中的作用。哈希函数是把传入的key映射到符号表的索引上。哈希碰撞处理有多个key映射到相同索引上时的情景,处理碰撞的普遍方式是拉链法和线性探测法。数组set(集合)map(映射)

weixin_51540348的博客 307

【LeetCode】双指针专项合集

今日练习:双指针:左右碰撞指针目的:掌握左右指针向中间移动,最终相会的解法。在下面这几道题中:思考不同题目中指针移动逻辑有什么区别理解本题流程:先跳过非字母数字,再进行比较(不看大小写)Character.isLetterOrDigit:去除非字母数字Character.toLowerCase:忽略大小写无思路:固定一个i,用双指针找到符合条件的一组答案题目要求不含重复,说明我们还需要进行去重操作。

2501_92547326的博客 522

代码随想录算法训练营第七天|leetcode454.四数相加2️⃣、leetcode383.赎金信、leetcode15.三数之和、leetcode18.四数之和

首先定位a的位置,也就是for循环的i,然后下面分别将指针指向i+1和最后一个元素,如果a+b+c>0,那么c--;,这个阶段是保持a不变了,然后当b,c两指针重合,a就移动到下一个位置。思路:这道题很基础,就说把magazine的字符构成存入哈希表中,然后用ransom中的字符对应去减,出现一个就减一个,直到遍历结束。然后遍历后两个数组的时候,求出0和c+d的差值,然后看在map中是否可以找见,如果可以找见,cnt+=map->Second。但有个棘手的问题,也就是说去重的问题。

m0_69034158的博客 425
上一篇: Leetcode(11)盛最多水的容器——双指针&&为什么不会错过最优解
下一篇: Leetcode(19) 删除链表的倒数第N个节点——快慢指针
softwareX4
博客等级 码龄9年 21粉丝 63原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值