15. 三数之和(双指针+去重优化)

文章目录

  • 前言
  • 一、题目描述
  • 二、代码原理
    • 1.暴力解法
    • 2.双指针优化
  • 三.代码编写
  • 总结


前言

在本篇文章中,我们将会讲到leetcode中15. 三数之和,我们将会用到双指针的方式解决这道问题,同时注意掌握算法原理的去重操作。

一、题目描述

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

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

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

示例 1:

输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]
解释:
nums[0] + nums[1] + nums[2] = (-1) + 0 + 1 = 0 。
nums[1] + nums[2] + nums[4] = 0 + 1 + (-1) = 0 。
nums[0] + nums[3] + nums[4] = (-1) + 2 + (-1) = 0 。
不同的三元组是 [-1,0,1] 和 [-1,-1,2] 。
注意,输出的顺序和三元组的顺序并不重要。
示例 2:

输入:nums = [0,1,1]
输出:[]
解释:唯一可能的三元组和不为 0 。
示例 3:

输入:nums = [0,0,0]
输出:[[0,0,0]]
解释:唯一可能的三元组和为 0 。

题目描述的可能没有那麽清晰,我们根据示例一具体看看。
🌟根据题目要求,我们需要在nums中找到三个数nums[ i ],nums[ j ],nums[ k ],满足nums[ i ]+nums[ j ]+nums[ k ]=0;
并且i!=j!=k。
比如nums = [-1,0,1,2,-1,-4]
我们可以发现0+0+0=0;但这是不允许的,三个数必须是不同的位置。
🌟答案中不可以包含重复的三元组。
根据nums中内容,满足条件的是【-1,0,1】【0 ,1,-1】【-1,2,-1】;
nums中有两个-1,可组成【-1,0,1】【0 ,1,-1】,虽然顺序不同,但里面的内容确是一样的,我们只保留一个!!!

🌟输出的顺序我们并不需要关心

二、代码原理

1.暴力解法

我们是很容易想到用三层for循环解决的,但是还有一个问题!!!就是去重操作。
有人就想到了去重用unordered_set去重,但是如果里面的两个为【-1,0,1】【0 ,1,-1】,我们依然不能去重。

接下来解决问题的难题就是如何保证找出来满足条件的三个数是顺序排放的??

我们对nums先进行排序就可以实现

时间复杂度O(N^3)

2.双指针优化

我们想想如何进行优化呢??
我们对数组进行排序了,我们就优先考虑双指针和二分算法。

我们以nums={-4,-4,-1,0,0,0,3,4,4,5}为例

🌟固定一个数nums[ i ]=ret
🌟left=i+1,right=nums.size()-1;
🌟在left和right区间内寻找两个数,使两个数满足nums[ left ]+nums[ right ]=-ret;,我们找到一组满足条件的数据之后,继续向下寻找,直到left和right相遇为止。
🌟i++,继续寻找

解决去重问题

我们依然可以用unordered_set解决
我们想想还有没有更优的解法解决??

在这里插入图片描述
我们发现nums[ left ]=0;nums[ right ]=4,刚好满足题目要求.left++,right- -,这时继续向后寻找,我们发现nums[ left ]还是等于0,nums[ rigth ]还是等于4,同样满足条件。但是和刚才的数据是一样的,需要去重。

我们在这里就可以完成去重操作
🌟left跳过与前一个元素相同的元素
🌟right跳过与后一个元素相同的元素
🌟i其实也需要进行去重,跳过与前一个元素相同的元素

在去重时要防止越界
例如:nums = [0,0,0,0]

时间复杂度O(N^2)

三.代码编写

我们这里还有一个可以优化的地方,三个数相加等于0,说明其中一个数必然是小于等于0的,如果我们固定的那个数是大于0的,我们就不用再往下判断了,因为是有序的,后面的数肯定也是大于0的。不会找出满足条件的三个数。

class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {//先排序sort(nums.begin(),nums.end());//寻找vector<vector<int>>vv;int n=nums.size();for(int i=0;i<n-2;){//小优化if(nums[i]>0) break;int ret=-nums[i];int left=i+1;int right=n-1;while(left<right){if(nums[left]+nums[right]>ret){right--;}else if(nums[left]+nums[right]<ret){left++;}else{vv.push_back({nums[i],nums[left],nums[right]});left++;right--;//去重leftwhile(left<right&&nums[left]==nums[left-1]){left++;}//去重rightwhile(left<right&&nums[right]==nums[right+1]){right--;}}}i++;//去重iwhile(i<n-2&&nums[i]==nums[i-1]){i++;}}return vv;}
};

总结

以上就是我们对Leetcode中15. 三数之和详细介绍,希望对大家的学习有所帮助,仅供参考 如有错误请大佬指点我会尽快去改正 欢迎大家来评论~~

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

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

相关文章

(41)5.6-5.8数据结构(栈和队列的应用和数组)

1.栈在括号匹配中的应用 #define _CRT_SECURE_NO_WARNINGS #define MaxSize 10 typedef struct { char data[MaxSize];//静态数组存放栈中元素 int top; //栈顶指针 }SqStack;//初始化栈 void InitStack(SqStack& S);//判断栈是否为空 bool StackEmpty(SqStack S…

Typora如何打出小黑点,空心圆

Typora如何打出小黑点&#xff0c;空心圆 小黑点 方法&#xff1a;Ctrlshift] 空心圆 在上一步的基础上先回车(Enter)、再Tab 键 先在第二行出现第二个小黑点&#xff0c;Tab后变成 空心圆 参考链接&#xff1a;https://blog.csdn.net/lalamadandan/article/details/125747…

DRF 纯净版创建使用

【一】介绍 &#xff08;1&#xff09;使用原因 在Django中&#xff0c;contrib 包包含了许多内置的app和中间件&#xff0c;如auth、sessions、admin等&#xff0c;这些app在创建新的Django项目时默认是包含在内的。然而&#xff0c;在开发RESTful API时&#xff0c;可能不需…

Jenkins android 自动打包安卓 centos8.5 运维系列五

1 新建项目android #cat android.sh #!/bin/bash rm -rf /data/.jenkins/workspace/android/app/build/outputs/apk/debug/* rm -rf /data/.jenkins/workspace/android/app/build/outputs/apk/release/* cd /data/.jenkins/workspace/android/app source /etc/profile g…

数据结构与算法===贪心算法

文章目录 定义适用场景柠檬水找零3.代码 小结 定义 还是先看下定义吧&#xff0c;如下&#xff1a; 贪心算法是一种在每一步选择中都采取在当前状态下最好或最优&#xff08;即最有利&#xff09;的选择&#xff0c;从而希望导致结果是全局最好或最优的算法。 适用场景 由于…

torch.searchsorted

torch.searchsorted 官方文档链接&#xff1a;torch.searchsorted — PyTorch 2.3 documentation 该函数用于在已排序的序列中查找要插入的值的位置&#xff0c;以保持序列的顺序&#xff0c; torch.searchsorted(sorted_sequence, values, *, out_int32False, rightFalse, s…

蓝桥杯13届JAVA A组 国赛

​​​​​​​ package 蓝桥杯国赛; // 贪心选个数最少的进行摆 // 2:1 ,3:1, 4:1,5 : 3,6:3,7:1 // 选 1&#xff0c;7&#xff0c;4&#xff0c;2&#xff0c;3&#xff0c;5&#xff0c;9 // 然后都选满10个 public class 火彩棒数字 {public static void main(String[] a…

PMP证书如何备考?

每个过了PMP考试的考生&#xff1a;“你是如何学习和准备的”&#xff1f;答案基本分三类&#xff1a; 第一种是“临时抱佛脚”式&#xff1b;第二种是“持续抗战式”&#xff1b;第三种是“疲劳作战式”。 第一种比较符合人性和期望—20世纪三大管理定义之一的帕金斯定律&am…

ESP32引脚入门指南(七):从理论到实践(IIC)

引言 IIC&#xff08;Inter-Integrated Circuit&#xff09;&#xff0c;又称为IC&#xff0c;是一种简单而高效的多主控器串行通信协议&#xff0c;常用于微控制器和各种外围设备之间的通信。在ESP32系列芯片中&#xff0c;IIC协议被广泛应用于连接各种传感器、存储器和其他支…

揭秘APP广告变现:自建平台收益真的有那么高吗?

在移动应用&#xff08;APP&#xff09;的世界里&#xff0c;广告变现是一种常见的盈利模式。开发者或企业通过向用户展示第三方广告来获取收益&#xff0c;这一过程中涉及到的关键角色包括广告主、广告平台以及开发者自己。在众多变现手段中&#xff0c;自建平台进行APP广告变…

Navicat安装配置(注册码)连接MySQL

下载资源 博主给你打包好了安装包&#xff0c;在网盘里&#xff0c;防止你下载到钓鱼软件 快说谢谢博主&#xff08;然后心甘情愿的点个赞~&#x1f60a;&#xff09; navicatformysql.zip_免费高速下载|百度网盘-分享无限制 (baidu.com) 安装流程 ①下载好压缩包后并解压 ② …

【2024亚马逊云科技峰会】Amazon Bedrock + Llama3 生成式AI实践

在 4 月 18 日&#xff0c;Meta在官网上公布了旗下最新大模型Llama 3。目前&#xff0c;Llama 3已经开放了80亿&#xff08;8B&#xff09;和700亿&#xff08;70B&#xff09;两个小参数版本&#xff0c;上下文窗口为8k&#xff0c;据称&#xff0c;通过使用更高质量的训练数据…

激光雷达在工厂散料体积测量中的经济效益分析

随着市场竞争的加剧&#xff0c;企业对于成本控制和效率提升的需求越来越迫切。激光雷达作为一种高效、准确的测量工具&#xff0c;在工厂散料体积测量中发挥着重要作用。本文将对激光雷达在工厂散料体积测量中的经济效益进行分析。 一、减少人工成本 传统的散料体积测量方法…

【DDR 终端稳压器】Sink and Source DDR Termination Regulator [C] S0 S1 S2 S3 S4 S5 6状态

TPS51200A-Q1 器件通过 EN 功能提供 S3 支持。EN引脚可以连接到终端应用中的SLP_S3信号。当EN 高电平&#xff08;S0 状态&#xff09;时&#xff0c;REFOUT 和 VO 引脚均导通。当EN 低电平&#xff08;S3状态&#xff09;时&#xff0c;VO引脚关断并通过内部放电MOSFET放电时…

趣味软件-吃什么(Eat What)?

&#x1f354;&#x1f35c;&#x1f355; 你是否也有这样的日常烦恼&#xff1f; 每天的“世纪难题”——今天吃什么&#xff1f; &#x1f570;️ 饭点到了&#xff0c;脑袋空空&#xff0c;选择困难症大爆发&#xff01; &#x1f46b; 和女朋友约会&#xff0c;却不知道她的…

求职网络安全:这个领域的就业机会正在增长

随着大安全时代的到来&#xff0c;网络安全已经从虚拟空间延伸到现实空间。当今网络战愈演愈烈&#xff0c;网络军备赛即将来临。网络空间领域的战争归根到底还是人才的竞争。面对新形势,建立高效的网络安全人才培养体系对中国信息安全产业发展和保证国家安全来讲都至关重要! 目…

PMP证书好考吗?

PMP新考纲还颠覆了自己旧有的五大知识领域&#xff0c;将原来的五大过程组整合成新领域中过程的一部分&#xff0c;提出了新的商业环境、过程、人员三大知识领域。 最关键的是&#xff0c;在新考纲中明确写到&#xff1a; 重要注意事项。通过工作任务分析开展的研究证实&…

科技查新中化工领域查新点如何确立与提炼?案例讲解!

我国化工科技查新工作始于1985年&#xff0c;至今经历了30多年的发展。化工类课题包含化工、炼油、 冶金、能源、轻工、石化、环境、医药、环保和军工等&#xff0c; 具有物质种类繁多、制备工艺复杂等特点。因此&#xff0c;本文结合化工查新项目实例&#xff0c;总结提高化工…

如何通过简单几个技巧,提升文心一言的回复质量

文心一言使用技巧 1 代入角色 例子1 我&#xff1a;500400 -2 AI&#xff1a;计算结果为&#xff1a;500400−2898增加数学老师角色&#xff0c;看一下回复的区别。 我&#xff1a;你是一个一年级的数学老师&#xff0c;请分步骤解释说明 500400-2等于多少 AI&#xff1a;…

XTuner微调LLM:1.8B、多模态和Agent

XTuner微调大语言模型&#xff0c;我们的介绍主要分为以下六个方面。 首先我们讲一下Finetune&#xff1a;分为两种Finetune范式和一条数据的一生来讲解。 为什么要微调&#xff1f;我们的大语言模型为基座模型&#xff0c;要应用到某种特定的场景&#xff0c;需要微调做相应适…