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

ops/2024/10/21 7:37:50/

文章目录

    • 题目链接:
    • 题目描述:
    • 解法
    • 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. 后面的步骤类似,就不多赘述了。

http://www.ppmy.cn/ops/121194.html

相关文章

一个简单的摄像头应用程序4

我们进一步完善了这个app01.py,我们优化了界面使其更人性化,下面介绍中包含了原有的功能及新增的功能: 创建和管理文件夹: create_folder 函数用于创建保存照片和视频的文件夹。 get_next_file_number 函数用于获取文件夹中下一个可用的文件编号。 图像处理: pil_to_cv 函…

8c语言基础文件

关于文件你必须了解的一些基本概念 什么是文件&#xff1f; 文件是计算机文件&#xff0c;属于文件的一种&#xff0c;与普通文件的载体不同&#xff0c;计算机文件是以计算机硬盘为载体存储在计算机上的信息集合。 在程序设计中&#xff0c;我们一般关注的文件有两类&#x…

从 TCP Reno 经 BIC 到 CUBIC

重读 TCP拥塞控制算法-从BIC到CUBIC 以及 cubic 的 tcp friendliness 与拐点控制 这两篇文章&#xff0c;感觉还是啰嗦了&#xff0c;今日重新一气呵成这个话题。 reno 线性逼近管道容量 Wmax&#xff0c;相当于一次查询(capacity-seeking)&#xff0c;但长肥管道从 0.5*Wmax …

MQTTnet.Extensions.ManagedClient客户端连接

一、MQTT客户端 代码如下&#xff08;示例&#xff09;&#xff1a; using MQTTnet; using MQTTnet.Client; using MQTTnet.Extensions.ManagedClient; using MQTTnet.Protocol; using MQTTnet.Server; using System; using System.Collections.Generic; using System.Linq…

如何将git 远程仓库update新建分支同步test到个人own仓库

若要将一个远程Git仓库&#xff08;比如GitHub, GitLab等&#xff09;中新建的分支&#xff08;比如叫new-branch&#xff09;同步到你个人的仓库&#xff08;假设是GitHub上你的个人仓库&#xff09;&#xff0c;并且你希望这个分支在你个人仓库中命名为test&#xff0c;你可以…

单元测试进阶-Mock使用和插桩

目录 一、基本概念 1、Mock 2、插桩&#xff08;Sutbbing&#xff09; 二、参考文章 一、基本概念 1、Mock Mock的作用就是不直接new对象&#xff0c;而是使用Mock方法或者注解Mock一个对象。 这个对象他不是new创建的对象&#xff0c;Mock对该对象的一些成员变量和方法…

云电脑、指纹浏览器,虚拟机这三者的区别

云电脑、指纹浏览器、虚拟机是三种常见的技术工具&#xff0c;它们各自有不同的应用场景和功能。以下是它们的区别和特点&#xff1a; 1. 云电脑 定义&#xff1a;云电脑是一种基于云计算技术的远程虚拟桌面服务。用户通过互联网远程访问并使用强大的云端服务器资源&#xff0…

maven工程的血案

最近在学习RPC框架&#xff0c;跟着视频边学边敲&#xff0c;结果发现代码跑起来爆了很多错误&#xff0c;最后通过推倒重新写了代码&#xff0c;并且按照maven工程要求代码规范就解决了bug。 maven工程的groupId和artifactId一定要和包名对应