leetcode(双指针)15.三数之和(C++详细解释)DAY10

文章目录

  • 1.题目
    • 示例
    • 提示
  • 2.解答思路
  • 3.实现代码
    • 结果
  • 4.总结

1.题目

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != kj != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请

你返回所有和为 0 且不重复的三元组。

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

示例

在这里插入图片描述

提示

在这里插入图片描述

2.解答思路

提取已知信息:
1.本题就是求三个数之和为0,
2.并且三个数的下标不能相等,
3.最后答案的集合互不相同。

思路:
1.首先对vector对象进行排序后,有利于去重操作。简单情况直接返回空集合。
其中:

vector.empty()//返回对象是否为空,若空,返回true,否则,返回false
vector.front()//返回vector对象第一个元素值
vector.back()//返回vector对象最后一个元素值

2.设三个变量分别代表三个元素下标,(双指针需要有一个固定的值)
因此令第一个值为 i , 去遍历另外两个下标head,tail
如果有相同的元素重复出现,第一次正常遍历,后面就都可以跳过了(对 i 和 head 一样的道理)

3.设a为两个指针下标对应元素需要相加的和
当head+tail对应的值大于a,tail减一
当head+tail对应的值小于a,head加一
注意:三个下标不能相等,因此若head==tail,直接跳出双指针循环,
当head+tail对应的值等于a时,把三个元素添加到答案ans中 ans.push_back({nums[i],nums[head],nums[tail]});

3.实现代码

class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums){int n=nums.size();sort(nums.begin(),nums.end());vector<vector<int>> ans;if(nums.empty() || nums.front()>0 || nums.back()<0)return {};for(int i =0;i <n-2;++i ){//i作为第一个数的下标//需要和上一次枚举的数不相同,去重,避免重复答案//当下标i-1和i一样,并且i已经计算过一次(i>0)时,可以直接跳过if(i >0 && nums[i] == nums[i-1] ){continue;}int head,tail;//此处使用双指针,head是i+1,tail是最后一个元素int a=-nums[i];//nums[head]+nums[tail]=0-nums[i] 是固定,对于下面的循环for(head=i+1,tail=n-1;head < tail ;++head){//需要和上一次枚举的数不相同,避免重复答案if (head > i  + 1 && nums[head] == nums[head - 1]) //当下标head-1和head一样,并且head已经计算过一次(head>i+1)时,可以直接跳过continue;//tail前移的条件while(head <tail && nums[head]+nums[tail]>a){--tail;}//如果指针重合,随着head后续增加//就不会有满足条件的,可以退出循环//要求有三个下标不能相同if(head == tail)break;if(nums[head]+nums[tail]  == a)ans.push_back({nums[i],nums[head],nums[tail]});} }return ans;}
};

结果

在这里插入图片描述
用时不止两个半小时,找出答案还好,后面的去重难住了很久,很难在自己的代码上修改成功,后来也是参考了别人的代码思路,然后又重写的。

4.总结

这个题有个bug就是,我的内层循环使用while就会时间超时,for循环就不会超时,就是第二个for循环的位置。暂时还没弄明白,不过以后遇到时间超时的时候,可以试一试换一个循环语句。

自信,坚持,upup~

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

车载诊断协议DoIP系列 —— 车载以太网诊断需求规范(网关、路由)

车载诊断协议DoIP系列 —— 车载以太网诊断需求规范(网关、路由) 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师(Wechat:gongkenan2013)。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 本就是小人物,输了就是输了,不要在意别人怎么看自…

C# CAD SelectionFilter下TypedValue数组

SelectionFilter是用于过滤AutoCAD实体的类&#xff0c;在AutoCAD中&#xff0c;可以使用它来选择具有特定属性的实体。构造SelectionFilter对象时&#xff0c;需要传入一个TypedValue数组&#xff0c;它用于定义选择规则。 在TypedValue数组中&#xff0c;每个元素表示一个选…

跟着pink老师前端入门教程-day26

一、计算机编程基础 &#xff08;一&#xff09;编程语言 1、编程 编程&#xff1a;就是让计算机为解决某个问题而使用某种程序设计语言编写程序代码&#xff0c;并最终得到结果的过程。 计算机程序&#xff1a;就是计算机所执行的一系列的指令集合&#xff0c;而程序全部…

160基于matlab的负熵和峭度信号的盲分离

基于matlab的负熵和峭度信号的盲分离。基于峭度的FastICA算法的收敛速度要快&#xff0c;迭代次数比基于负熵的FastICA算法少四倍以上。SMSE随信噪比增大两种判据下的FastICA算法都逐渐变小&#xff0c;但是基于峭度的算法的SMSE更小&#xff0c;因此基于峭度的FastICA算法性能…

【区块链技术开发语言】在ubuntu18 系统环境下命令操作安装GO语言开发环境

要在Ubuntu 18系统上安装GO语言开发环境,您可以按照以下步骤进行: 打开终端(Ctrl + Alt + T)。 使用以下命令下载GO语言安装包: 或者手动打开链接下载: wget https://golang.org/dl/go1.17.5.linux-amd64.tar.gz确保替换链接中的版本号为最新版本。 解压下载的安装包…

详解tomcat中的jmx监控

目录 1.概述 2.如何开启tomcat的JMX 3.tomcat如何实现JMX的源码分析 1.概述 本文是博主JAVA监控技术系列文章的第二篇&#xff0c;前面一篇文章中我们介绍了JAVA监控技术的基石——jmx&#xff1a; 【JMX】JAVA监控的基石-CSDN博客 本文我们将从使用和源码实现两个方面聊…

Codeforces Round 924(Div.2) A~E

A.Rectangle Cutting (模拟) 题意&#xff1a; 给出一个长方形&#xff0c;通过平行于原始矩形的一条边进行切割&#xff0c;将该矩形切割成两个边长为整数的矩形。询问是否能通过旋转和移动这两个矩形&#xff0c;得到新的矩形。 分析&#xff1a; 可以发现拼成的新长方形…

应用进程跨越网络的通信

目录 1 系统调用和应用编程接口 应用编程接口 API 几种应用编程接口 API 套接字的作用 几种常用的系统调用 1. 连接建立阶段 2. 传送阶段 3. 连接释放阶段 1 系统调用和应用编程接口 大多数操作系统使用系统调用 (system call ) 的机制在应用程序和操作系统之间传递控制…

Python 中实现线性搜索算法

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站零基础入门的AI学习网站~。 前言 线性搜索算法&#xff0c;也称为顺序搜索算法&#xff0c;是一种简单但常用的搜索技术&#xff0c;用于查…

给定n个结点的树,其中有k个结点是特殊结点(未知),定义好结点:该结点到k个特殊结点的距离之和最小。若随机k个结点为特殊结点,求好结点个数的期望值

题目 思路&#xff1a; 举例&#xff1a; 其中黑色结点为特殊结点&#xff0c;可以看出&#xff0c;每种情况都有一个结点的s值不等于k / 2&#xff0c;但是是好结点&#xff0c;所以最后答案加一。 #include <bits/stdc.h> using namespace std; #define int long lon…

5种风格非常经典的免费wordpress主题

免费wordpress主题下载 高端大气上档次的wordpress主题&#xff0c;也可以是免费的&#xff0c;可以在线免费下载。 https://www.wpniu.com/themes/288.html wordpress免费主题 高端大气的wordpress免费主题&#xff0c;LOGO在顶部左侧&#xff0c;导航菜单在顶部右侧。 ht…

codechef121轮(A-G)

codechef121轮&#xff08;A-G)题解 ⭐️A.Leg Space 题目&#xff1a; &#x1f31f;题解&#xff1a; 很简单&#xff0c;比较就行 代码&#xff1a; #include <bits/stdc.h> using namespace std; int main() {// your code goes here int n,m;cin>>n>>…