【C++算法】8.双指针_三数之和

news2024/12/25 14:58:11

文章目录

    • 题目链接:
    • 题目描述:
    • 解法
    • C++ 算法代码:
    • 图解


题目链接:

15.三数之和


题目描述:

d0406aca4b46568daffef79f8820a511


解法

解法一:排序+暴力枚举+利用set去重O(n3)

例如nums=[-1,0,1,2,-1,-4]

[-1,0,1][0,1,-1][1,0,-1]下标不同但是都满足 ,这个题难在去重

可以通过排序去重,先把数组排序再找,就不会出现上面一行出现的问题了。

但是这里举例的nums里面由两个-1,可能会出现[-1,0,1]两次。这个就可以通过set容器去除。

解法二:排序+双指针

  1. 先排序
  2. 固定一个数a
  3. 在该数后面的区间内,利用双指针算法快速找到两个数的和等于-a

处理细节:

  1. 去重

    找到一种结果之后,leftright指针要跳过重复元素

    当使用完一次双指针算法之后,i也要跳过重复元素

  2. 不漏掉

    找到一种结果后,不要停,缩小区间,继续寻找


C++ 算法代码:

class Solution 
{
    public:
    vector<vector<int>> threeSum(vector<int>& nums) 
    {
        vector<vector<int>> ret;//用ret记录结果
        // 1. 排序
        sort(nums.begin(), nums.end());
        // 2. 利用双指针解决问题
        int n = nums.size();
        for(int i = 0; i < n; ) // 固定数 a
        {
            if(nums[i] > 0){
                break; // 小优化
            }
            int left = i + 1, right = n - 1, target = -nums[i];
            while(left < right)
            {
                int sum = nums[left] + nums[right];
                if(sum > target){
                    right--;
                }
                else if(sum < target){
                    left++;
                }
                else{//说明找到最终结果
                    ret.push_back({nums[i], nums[left], nums[right]});//把三个数放到ret里面,{}会形成一个vector int的数组放到ret里面
                    left++, right--;
                    // 去重操作 left 和 right
                    while(left < right && nums[left] == nums[left - 1]){
                        left++;
                    }
                    while(left < right && nums[right] == nums[right + 1]){
                        right--;
                    }
                }
            }
             
            i++;
            // 去重 i
            while(i < n && nums[i] == nums[i - 1]){
                i++;
            }
        }
        return ret;
    }
};

图解

nums=[-4,-4,-1,0,0,0,1,1,4,4,5,6]

34fa0244f07ddec5c539713381884645

  1. n=12,进入for循环,i=0,left=1,right=11,target=4,left < right进入while循环,sum=2<target,left++

2dd3e3a086bdc0457eaf5d700fa423a2

  1. sum=-1+6=5>target,right--

54388bbf03c61d365d837a18085a565b

  1. sum=-1+5=4=targe,把[-4,-1,5]放到ret里面,left++, right--

66036a5d816892562c4e2f3c427bf739

  1. sum=0+4=4=targe,把[-4,0,4]放到ret里面,left++, right--,执行去重操作

a718cff48223687c084491f9cbab2d33

  1. sum=1+1=2<targe,left++,跳出while循环,i++,执行去重,然后开始第二轮双指针算法。

59c352e3a71298c184c55395d2ba535b

  1. 后面的步骤类似,就不多赘述了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2181016.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

DolphinScheduler 资源中心无法上传大文件

服务&#xff1a;dolphinscheduler 版本&#xff1a;v3.16 问题描述&#xff1a;资源中心-文件管理中使用文件上传是出现中断或上传失败 排除思路&#xff1a; 测试小文件或其他类型文件时是否正常&#xff1b;F12查看接口调用成功以及失败时的对比&#xff0c;发现接口调用…

智慧应急指挥平台1+6+N体系建设方案

1. 智慧应急指挥平台概述 智慧应急指挥平台是一个综合性的应急响应体系&#xff0c;旨在通过高效的信息整合和通信技术&#xff0c;提升应急管理的智能化水平。该平台采用“16N”的体系结构&#xff0c;集成了智慧城市、智慧园区、智慧矿山等多个智慧应用&#xff0c;并依托三…

位运算(3)_判定字符是否唯一_面试题

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 位运算(3)_判定字符是否唯一_面试题 收录于专栏【经典算法练习】 本专栏旨在分享学习算法的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目…

[Bandzip] 文件解压工具的下载及详细安装使用过程(附有下载文件)

文件解压工具&#xff0c;避免解压出错&#xff0c;双击即可解压文件 下载链接在文末 下载压缩包后解压 &#xff01;&#xff01;安装路径不要有中文 解压得到文件 双击exe文件 同意并安装 安装完成后&#xff0c;点击关闭&#xff0c; 右键点击需要解压的压缩包&#xff0…

Postman另存的curl脚本调试运行

文章目录 背景1、修改header 标识2、修改post请求方式3、修改单引号为双引号4、整体修改去掉多余字符curl 一行显示 5、执行结果 背景 在日常项目中调用外部服务接口&#xff0c;经常使用到Postman、ApiPost等工具调用&#xff0c;在没有工具的时候&#xff0c;可以使用 curl …

TI DSP TMS320F280025 Note14:模数转换器ADC原理分析与应用

TMS320F280025 模数转换器ADC原理分析与应用 ` 文章目录 TMS320F280025 模数转换器ADC原理分析与应用逐次比较型ADC和双积分型ADC工作原理逐次比较型 ADC双积分型 ADC280025ADCADC原理分析ADC时钟SOCSOC内部原理ADC触发方式ADC采集(采样和保持)窗口通道寄生电容基准电压发生器模…

心理咨询预约管理系统(含源码+sql+视频导入教程)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 心理咨询预约管理系统2拥有三个角色&#xff1a; 管理员端 首页 系统近况&#xff08;咨询师和注册来访者数量&#xff0c;预约数量&#xff09; 显示最新的消息、留言和公告&#xff0…

回归预测 | Matlab基于POA-SVR鹈鹕算法优化支持向量机的数据多输入单输出回归预测

回归预测 | Matlab基于POA-SVR鹈鹕算法优化支持向量机的数据多输入单输出回归预测 目录 回归预测 | Matlab基于POA-SVR鹈鹕算法优化支持向量机的数据多输入单输出回归预测预测效果基本描述程序设计参考资料 预测效果 基本描述 1.Matlab基于POA-SVR鹈鹕算法优化支持向量机的数据…

rk3399开发环境的介绍

零. 前言 由于Bluez的介绍文档有限&#xff0c;以及对Linux 系统/驱动概念、D-Bus 通信和蓝牙协议都有要求&#xff0c;加上网络上其实没有一个完整的介绍Bluez系列的文档&#xff0c;所以不管是蓝牙初学者还是蓝牙从业人员&#xff0c;都有不小的难度&#xff0c;学习曲线也相…

中信银行西安分行:“极地来信”沉浸展西安站正式启幕

9月7日&#xff0c;中信银行“极地来信”跨界整合品牌线下巡展西安站在MOMOPARK艺术购物中心正式启幕。本次活动聚焦中国极地考察的冰路征程&#xff0c;以沉浸式展览与艺术创意传递中国极地考察“向南而行”的无畏精神&#xff0c;并将极地考察的探索之路与金融创新的实践之路…

智慧平台 PersonalDayInOutSchoolData SQL注入漏洞

漏洞描述 EDU 某智慧平台 PersonalDayInOutSchoolData 接口存在SQL注入漏洞&#xff0c;未经身份验证的远程攻击者除了可以利用 SQL 注入漏洞获取数据库中的信息&#xff08;例如&#xff0c;管理员后台密码、站点的用户个人信息&#xff09;之外&#xff0c;甚至在高权限的情…

OpenCL 学习(1)---- OpenCL 基本概念

目录 Overview异构并行计算OpenCL 架构平台模型执行模型OpenCL 上下文OpenCL 命令队列内核执行编程模型存储器模型存储器对象共享虚拟存储器 Overview OpenCL(Open Computing Language&#xff0c;开放计算语言) 最早由苹果公司提交草案&#xff0c;并于 AMD, IBM ,intel 和 n…

python14_运算符复合赋值

复合赋值缩写 A 7 B 3 C "hello" D "world" E True F False# 加法赋值运算符,7 3 10 def add1(a, b):a b # 等同于a a breturn a# 字符串加法赋值运算符,hello world helloworld def add2(c, d):c d # 等同于字符串拼接,c c dreturn c# …

尚乐代驾重做

微信小程序客户端登陆 一 总体流程 前段携带code发送请求给后端&#xff0c;后端利用微信小程序相关api解析这个code&#xff0c;获取能唯一认证登陆身份的openid。接着先到数据库查询是否有这个id&#xff0c;如果没有就保存用户信息实现注册&#xff0c;并返回token到前端…

百度百科 X-Bk-Token 算法还原

声明 本文章中所有内容仅供学习交流,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请私信我立即删除! 文章目录 声明案例地址参数分析X-Bk-Token算法追踪X-Bk-Token后缀算法还原c 值跟踪与算法还原往期逆向文章推荐最近太忙了,博客摆烂了好…

算法题——层序遍历(一层按一组输出)

输入[1,2,3,4,5] 输出[[1],[2,3],[4,5]] (按照一层输出为一组) 思路&#xff1a; 使用队列&#xff0c;在队列内层再加入一层for循环&#xff0c;每层的个数就是队列中当前队列的个数。 python&#xff1a; from collections import dequeclass Solution(Object):def levelO…

VUE a-table 动态拖动修改列宽+固定列

实现效果 实现思路 自定义表头&#xff0c;在标题后面加两个标签&#xff0c;分别用来显示拖拽图标&#xff08;cursor: col-resize&#xff09;&#xff0c;和蓝色标记线&#xff08;有的时候鼠标移动过程中不一定会在表内&#xff0c;这个时候不显示图标&#xff0c;只显示蓝…

独立样本t检验及其案例分析

作者简介&#xff1a;热爱数据分析&#xff0c;学习Python、Stata、SPSS等统计语言的小高同学~个人主页&#xff1a;小高要坚强的博客当前专栏&#xff1a;SPSS本文内容&#xff1a;独立样本t检验及其案例分析作者“三要”格言&#xff1a;要坚强、要努力、要学习 目录 一、引…

2024版Clion debug无法查看函数内数组内容 解决办法

参考Clion debug查看数组中的内容&#xff0c;新版本有所变化 众所周知&#xff0c;进入函数的数组debug不显示内容&#xff0c;解决办法如下&#xff1a; 在Evaluate expression中输入 *(int(*)[10])(数组名)

硬件设计基础之闲聊千兆以太网

一、千兆以太网的介绍 常见的以太网有几种形式&#xff0c;10Mbps、100MHz、1000Mbps、10Gbps等&#xff0c;当然还有更高的&#xff0c;接触的少些&#xff0c;暂且不聊。 10Mbps、100Mbps&#xff0c;多见于单片机使用&#xff0c;比如STM32/GD32 1000Mbps、10Gbps&#x…