当前位置: 首页 > news >正文

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

文章目录

    • 题目链接:
    • 题目描述:
    • 解法
    • 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 和 rightwhile(left < right && nums[left] == nums[left - 1]){left++;}while(left < right && nums[right] == nums[right + 1]){right--;}}}i++;// 去重 iwhile(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. 后面的步骤类似,就不多赘述了。

相关文章:

  • 初识Linux · O(1)调度算法
  • 什么是IIC通信协议?
  • 【网络安全】内部应用中的多重漏洞利用
  • 01---java面试八股文——springboot---10题
  • Java中的Junit、类加载时机与机制、反射、注解及枚举
  • XSS | XSS 常用语句以及绕过思路
  • 【自然语言处理】词嵌入模型
  • docker相关命令
  • Golang | Leetcode Golang题解之第449题序列化和反序列化二叉搜索树
  • vue框架学习-- 父子页面 参数方法调用
  • 执行力怎么培养?
  • 1.1.4 计算机网络的分类
  • 【C++打怪之路Lv4】-- 类和对象(中)
  • Find My汽车钥匙|苹果Find My技术与钥匙结合,智能防丢,全球定位
  • 介绍篇| 爬虫工具介绍
  • [deviceone开发]-do_Webview的基本示例
  • 【Redis学习笔记】2018-06-28 redis命令源码学习1
  • angular2 简述
  • KMP算法及优化
  • open-falcon 开发笔记(一):从零开始搭建虚拟服务器和监测环境
  • Transformer-XL: Unleashing the Potential of Attention Models
  • 关于 Cirru Editor 存储格式
  • 来,膜拜下android roadmap,强大的执行力
  • 每天10道Java面试题,跟我走,offer有!
  • 面试总结JavaScript篇
  • 通过几道题目学习二叉搜索树
  • 一加3T解锁OEM、刷入TWRP、第三方ROM以及ROOT
  • 移动互联网+智能运营体系搭建=你家有金矿啊!
  • elasticsearch-head插件安装
  • 宾利慕尚创始人典藏版国内首秀,2025年前实现全系车型电动化 | 2019上海车展 ...
  • 如何用纯 CSS 创作一个菱形 loader 动画
  • 移动端高清、多屏适配方案
  • 支付宝花15年解决的这个问题,顶得上做出十个支付宝 ...
  • ​如何使用QGIS制作三维建筑
  • # 透过事物看本质的能力怎么培养?
  • ## 临床数据 两两比较 加显著性boxplot加显著性
  • #职场发展#其他
  • (1)虚拟机的安装与使用,linux系统安装
  • (145)光线追踪距离场柔和阴影
  • (33)STM32——485实验笔记
  • (9)目标检测_SSD的原理
  • (LeetCode 49)Anagrams
  • (六) ES6 新特性 —— 迭代器(iterator)
  • (六)Flink 窗口计算
  • (四)Controller接口控制器详解(三)
  • (一) storm的集群安装与配置
  • *** 2003
  • *ST京蓝入股力合节能 着力绿色智慧城市服务
  • *算法训练(leetcode)第四十天 | 647. 回文子串、516. 最长回文子序列
  • .bashrc在哪里,alias妙用
  • .NET C# 使用GDAL读取FileGDB要素类
  • .NET CF命令行调试器MDbg入门(四) Attaching to Processes
  • .net core使用RPC方式进行高效的HTTP服务访问
  • .Net6 Api Swagger配置
  • .NET开源项目介绍及资源推荐:数据持久层 (微软MVP写作)