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://www.mzph.cn/news/835539.shtml

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

相关文章

PHP高级教程

&#x1f40c;博主主页&#xff1a;&#x1f40c;​倔强的大蜗牛&#x1f40c;​ &#x1f4da;专栏分类&#xff1a;PHP &#x1f4da;参考教程&#xff1a;菜鸟\编程网❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 目录 一、PHP 多维数组 二、PHP date&#xff08;&#…

免费获取!图论+灰色系统+混合优化算法程序代码!

前言 算法&#xff08;Algorithm&#xff09;是指解题方案的准确而完整的描述&#xff0c;是一系列解决问题的清晰指令&#xff0c;算法代表着用系统的方法描述解决问题的策略机制。算法优化是指对算法的有关性能进行优化&#xff0c;如时间复杂度、空间复杂度、正确性、健壮性…

Java | Leetcode Java题解之第79题单词搜索

题目&#xff1a; 题解&#xff1a; class Solution {public boolean exist(char[][] board, String word) {char[] words word.toCharArray();for(int i 0; i < board.length; i) {for(int j 0; j < board[0].length; j) {if (dfs(board, words, i, j, 0)) return t…

Linux·基本指令

从本节开始将新开一个关于Linux操作系统的板块&#xff0c;其实Linux也没什么太神秘的&#xff0c;就是一个操作系统(OS)嘛&#xff0c;跟Windows操作系统是一个概念&#xff0c;只不过Windows中的大部分操作都是用光标点击来进行人机交互&#xff0c;但是Linux是通过输入命令行…

fmt::arg的使用

来自&#xff1a; https://hackingcpp.com/cpp/libs/fmt.html #include <fmt/format.h> // literalsint main () { int i 2; double d 4.567; fmt::print("{x} {x}\n", fmt::arg("x",d)); fmt::print("{pi} * {0}\n", i, fmt::arg(&…

今天遇到一个GPT解决不了的问题

问题描述 你好&#xff0c;postman的一个post请求&#xff0c;编辑器里面放了一个很长的json数据&#xff0c;报Tokenization is skipped for long lines for performance reasons. This can be configured via editor.maxTokenizationLineLength.&#xff0c;但是同样的数据&a…

住宅ip与数据中心ip代理的区别是什么

代理通常意味着“替代”。它是用户设备和目标服务器之间的中介&#xff0c;允许在不同的IP地址下上网。代理ip根据来源分类可分住宅ip与数据中心ip&#xff0c;二者之间区别是什么呢&#xff1f; 住宅ip是由互联网服务提供商(ISP)提供给家庭的IP地址。出于这个原因&#xff0c…

灾备建设中虚拟机备份自定义数据块大小应用

灾备建设中&#xff0c;传输备份数据时&#xff0c;自定义数据块大小可以帮助优化数据传输和存储效率。 确定数据块大小&#xff0c;首先&#xff0c;需要确定合适的数据块大小。这可以根据备份数据量和网络带宽来决定。通常情况下&#xff0c;较小的数据块可以更好地适应网络…

Linux各目录及每个目录的详细介绍

目录 /bin 存放二进制可执行文件(ls,cat,mkdir等)&#xff0c;常用命令一般都在这里。 /etc 存放系统管理和配置文件 /home 存放所有用户文件的根目录&#xff0c;是用户主目录的基点&#xff0c;比如用户user的主目录就是/home/user&#xff0c;可以用~user表示 /us…

华为开源自研AI框架昇思MindSpore应用案例:在ResNet-50网络上应用二阶优化实践

常见的优化算法可分为一阶优化算法和二阶优化算法。经典的一阶优化算法如SGD等&#xff0c;计算量小、计算速度快&#xff0c;但是收敛的速度慢&#xff0c;所需的迭代次数多。而二阶优化算法使用目标函数的二阶导数来加速收敛&#xff0c;能更快地收敛到模型最优值&#xff0c…

三星硬盘格式化后怎么恢复数据

在数字化时代&#xff0c;硬盘作为数据存储的核心部件&#xff0c;承载着我们的重要文件、照片、视频等资料。然而&#xff0c;不慎的格式化操作可能使我们失去宝贵的数据。面对这样的困境&#xff0c;许多用户可能会感到无助和焦虑。本文旨在为三星硬盘用户提供格式化后的数据…

geotrust企业通配符证书2990

随着时代的变化&#xff0c;人们获取信息的方式由报纸、书籍变为手机、电脑&#xff0c;因此很多企事业单位用户开始在互联网中创建网站来进行宣传&#xff0c;吸引客户。为了维护网站安全环境&#xff0c;保护客户数据&#xff0c;企事业单位也开始使用SSL数字证书&#xff0c…

ubuntu install vivado 2023

Downloads sudo mkdir /opt/vivado

算法练习day7

四数相加II 代码随想录 0454.四数相加II 454. 四数相加 II - 力扣&#xff08;LeetCode&#xff09; &#xff08;用时&#xff1a;0.5小时&#xff09; 思路 本道题是需要在四个数组中&#xff0c;各找一个数&#xff0c;这些数加起来能够等于0&#xff0c;那么就是答案元…

onnx模型截取部分

这个是有需求的&#xff0c;比如有多个输入节点&#xff0c;我只用其中几个&#xff0c;或有多个输出节点&#xff0c;我只用其中几个。 比如这个输入&#xff0c;我们可以直接把transpose去掉&#xff0c;用类pytorch的N,C,H,W的格式输入。 还有如下输出&#xff1a; tran…

喜报|才聚荣获“2024年度PMI(中国)注册教育机构杰出机构奖”!

5月10日&#xff0c;“2024PMI&#xff08;中国&#xff09;注册教育机构合作伙伴大会”隆重举行&#xff0c;才聚集团受邀参加此次盛会。 本次大会就项目管理职业生态、发展趋势等热门问题进行了深入探讨分析。 PMP认证自1999年引入中国&#xff0c;为国家培养了大量项目管理…

Springboot+Vue项目-基于Java+MySQL的宠物商城网站系统(附源码+演示视频+LW)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &…

618有什么好物推荐?618平价好物清单,让你买到物超所值的好货!

618大促即将开启&#xff0c;大家是不是已经跃跃欲试&#xff0c;准备大肆采购一番了呢&#xff1f;别心急&#xff0c;让我为你揭晓几款数码、家居领域中的明星产品。这些好物不仅实用&#xff0c;而且性价比超高&#xff0c;让你在享受购物乐趣的同时&#xff0c;也能买到真正…

人工智能的未来:Sam Altman 揭穿搜索引擎谣言,调侃 ChatGPT 和 GPT-4 的“神奇”更新

人工智能的未来&#xff1a;Sam Altman 揭穿搜索引擎谣言&#xff0c;调侃 ChatGPT 和 GPT-4 的“神奇”更新 概述 科技界充斥着有关人工智能研究先驱组织 OpenAI 将推出类似谷歌搜索引擎的传言。然而&#xff0c;首席执行官 Sam Altman 已经平息了这些谣言&#xff0c;并透露…

mac 讨厌百度网盘怎么办

一、别拦我 首先请允许我泄个愤&#xff0c;tmd百度网盘下个1g的文件下载速度竟然超不过200k&#xff0c;只要不放在所有已打开软件的最前面&#xff0c;它就给你降到10k以内&#xff0c;关键是你慢就慢了&#xff0c;我也不是很着急&#xff0c;关键是你日常下载失败并且总是…