【LeetCode热题100】【双指针】三数之和

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != ji != 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 。

提示:

  • 3 <= nums.length <= 3000
  • -105 <= nums[i] <= 105

题解

前有两数之和用哈希在O(n)的时间复杂度内解决,现有三数之和需要用到双指针在O(n²)内解决

暴力的话需要三层循环而且需要去重复

我们可以先从小到大排序一下元素,那么现在元素是有序的了,而且左边的比右边的小或者相等

如果某元素大于0了,那么这个元素后面是不会有答案出现了,因为后面的元素不会比前面的小

找到一个小于等于0的元素了,让左指针指向后面一个元素,右指针指向最大的元素,把他们相加起来,如果和等于0,那么这三个是一个答案存起来,继续看左边的元素往右有没有相同的元素,如果有的话更新一下左边指针,因为这三个数字的组合已经是答案了,相同的就是重复了,然后同样看右边的元素往左有没有相同的元素,有的话也更新一下

如果和不等于0,和比0小,那么移动左指针让候选元素变大,如果和比0大,那么移动右指针让候选元素变小

排序nlogn,遍历元素n,两层while循环因为循环条件都是一起的加起来也是n,所以就是n²

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        if(nums.size()<3)
            return {};
        sort(nums.begin(),nums.end());
        if(nums[0]>0) // 如果最小的都大于0了那么肯定没有
            return {};
        vector<vector<int>>answer;
        for(int i=0;i<nums.size();i++){
            if(i>0&&nums[i]==nums[i-1])  // 元素相同的不做判断
                continue;
            int left=i+1,right=nums.size()-1;  // 取左右双指针
            while(left<right){
                int sum=nums[i]+nums[left]+nums[right];
                if(sum==0){
                    answer.push_back({nums[i],nums[left],nums[right]});
                    while(left<right&&nums[left]==nums[left+1]){left++;}  // 左边相同的去掉
                    while(left<right&&nums[right-1]==nums[right]){right--;}  // 右边相同的去掉
                    left++;
                    right--;
                }else if(sum<0){  // 和不为0但是小于0说明和太小了移动左指针变大
                    left++;
                } else{  // 移动右指针变小
                    right--;
                }
            }
        }
        return answer;
    }
};

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

具有五层协议的网络体系结构

目录 一、计算机的网络体系结构 二、五层协议的体系结构 1、物理层 2、数据链路层 3、网络层 4、传输层 5、应用层 三、数据在各层之间传输的过程 一、计算机的网络体系结构 二、五层协议的体系结构 1、物理层 利用传输介质为通信的网络结点之间建立、管理和释放物理连…

电压驻波比

电压驻波比 关于IF端口的电压驻波比 一个信号变频后&#xff0c;从中频端口输出&#xff0c;它的输出跟输入是互异的。这个电压柱波比反映了它输出的能量有多少可以真正的输送到后端连接的器件或者设备。

沐风老师3DMAX随机变换工具RandomTransform插件使用方法详解

3DMAX随机变换工具RandomTransform插件使用方法 3dMax随机变换工具RandomTransform&#xff0c;是一款用MAXScript脚本语言开发的3dsMax小工具&#xff0c;可以随机变换选中的单个或多个对象的位置、角度及大小。 在3dMax中“变换”工具是最常用的工具&#xff08;移动、旋转和…

【hacker送书第8期】Java从入门到精通(第7版)

第8期图书推荐 内容简介编辑推荐作者简介图书目录参与方式 内容简介 《Java从入门到精通&#xff08;第7版&#xff09;》从初学者角度出发&#xff0c;通过通俗易懂的语言、丰富多彩的实例&#xff0c;详细讲解了使用Java语言进行程序开发需要掌握的知识。全书分为4篇共24章&a…

Java生成word[doc格式转docx]

引入依赖 <!-- https://mvnrepository.com/artifact/org.freemarker/freemarker --><dependency><groupId>org.freemarker</groupId><artifactId>freemarker</artifactId><version>2.3.32</version></dependency> doc…

家政服务预约小程序系统的开发;

家政服务预约小程序系统的开发&#xff0c;既是对传统加盟服务模式的创新&#xff0c;也是家政商家企业营销推广服务的升级。它推动整个家政服务行业实现线上线下深度融合&#xff0c;提升用户消费体验&#xff0c;实现了雇主、服务提供者、家政企业商家三者之间的无缝衔接&…

Spring之AOP理解与应用

1. AOP的认识 面向切面编程&#xff1a;基于OOP基础之上新的编程思想&#xff0c;OOP面向的主要对象是类&#xff0c;而AOP面向的主要对象是切面&#xff0c;在处理日志、安全管理、事务管理等方面有非常重要的作用。AOP是Spring中重要的核心点&#xff0c;AOP提供了非常强…

阿里云服务器租赁价格表,预算100元到5000元可选配置

阿里云服务器租用费用&#xff0c;阿里云轻量应用服务器2核2G3M带宽轻量服务器一年87元&#xff0c;2核4G4M带宽轻量服务器一年165元12个月&#xff0c;ECS云服务器e系列2核2G配置3M固定带宽99元一年、2核4G配置365元一年、2核8G配置522元一年&#xff0c;阿里云u1服务器2核4G、…

语义分割 DeepLab V1网络学习笔记 (附代码)

论文地址&#xff1a;https://arxiv.org/abs/1412.7062 代码地址&#xff1a;GitHub - TheLegendAli/DeepLab-Context 1.是什么&#xff1f; DeepLab V1是一种基于VGG模型的语义分割模型&#xff0c;它使用了空洞卷积和全连接条件随机&#xff08;CRF&#xff09;来提高分割…

RPG项目01_技能释放

基于“RPG项目01_新输入输出”&#xff0c; 修改脚本文件夹中的SkillBase脚本&#xff1a; using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Events; //回复技能&#xff0c;魔法技能&#xff0c;物理技能…

分布式搜索引擎elasticsearch(二)

1.DSL查询文档 elasticsearch的查询依然是基于JSON风格的DSL来实现的。 1.1.DSL查询分类 Elasticsearch提供了基于JSON的DSL(Domain Specific Language)来定义查询。常见的查询类型包括: 查询所有:查询出所有数据,一般测试用。例如:match_all 全文检索(full text)查…

d3dx9_43.dll丢失原因以及5个解决方法详解

在电脑使用过程中&#xff0c;我们可能会遇到一些错误提示&#xff0c;其中之一就是“d3dx9_43.dll缺失”。这个错误提示通常表示我们的电脑上缺少了DirectX的一个组件&#xff0c;而DirectX是游戏和多媒体应用所必需的软件。本文将介绍d3dx9_43.dll缺失对电脑的影响以及其原因…

【从零开始学习Redis | 第六篇】爆改Setnx实现分布式锁

前言&#xff1a; 在Java后端业务中&#xff0c; 如果我们开启了均衡负载模式&#xff0c;也就是多台服务器处理前端的请求&#xff0c;就会产生一个问题&#xff1a;多台服务器就会有多个JVM&#xff0c;多个JVM就会导致服务器集群下的并发问题。我们在这里提出的解决思路是把…

PHP项目启动记录

PHP项目启动记录 1. 项目整体目录2. bash_profile3. nginx的conf配置4. vim /etc/hosts5. php -v6.修改nginx后重新加载nginx7. npm run watch-app --moduleattendance --platformmobile8. vim ~/.zshrc 1. 项目整体目录 2. bash_profile ~/.bash_profile是Mac系统中的一个配置…

Vue项目目录结构

项目结构 目录说明.vscodeVSCode工具的配置文件node_modulesVue项目的运行依赖文件public资源文件夹&#xff08;浏览器图标&#xff09;src源码文件夹.gitignore配置git忽略文件index.html入口HTML文件package-lock.json信息描述文件&#xff08;所有模块&#xff09;package…

MySQL实现(高可用方案-MHA安装及配置)

MySQL高可用性解决方案Master High Availability (MHA) 是一种在 MySQL 故障转移环境中实现快速故障转移和数据保护的开源软件。MHA 能在 MySQL 主节点发生故障时&#xff0c;自动将备节点提升为主节点&#xff0c;并且不会中断正在进行的 SQL 操作。 需求&#xff1a;主从配置…

编程应用实例,早点快餐店点餐软件支持零售价和会员价,软件定制开发

编程应用实例&#xff0c;早点快餐店点餐软件支持零售价和会员价&#xff0c;软件定制开发 一、编程应用实例&#xff1a; 软件适用范围&#xff1a; 1、早点 2、快餐店 3、面馆 4、汉堡店 5、奶茶店 6、饭店等 程序说明&#xff1a; 二、程序说明&#xff1a; 1、软件…

人机交互——言语信息表示模型

如何将大量的言语碎片进行统一表示和存储&#xff0c;以便能够提取不同类型言语信息中的重要特征和语义信息&#xff0c;并计算和推理用户的交互意图&#xff0c;是一个极具挑战性的问题。 1.言语信息表示模型概述 2.言语信息表示模型结构 3.言语信息表示模型应用

腾讯云2023年双十二活动整理汇总

腾讯云双十二推出了年末感恩回馈活动&#xff0c;年底最后一次大促活动&#xff0c;大家把握好上云时间&#xff0c;小编给大家整理了2023年腾讯云双十二优惠活动&#xff0c;不要错过这次上云好时机&#xff01; 一、腾讯云双十二活动入口 活动地址&#xff1a;txy.ink/act/ …

迪文串口5使用查询方式发送数据

迪文屏串口5寄存器如下 发送数据我采用的不是中断&#xff0c;而是查询发送标志位实现的。 串口5不像串口2一样&#xff08;串口2可以位寻址&#xff0c;串口5不行&#xff09;&#xff0c;所以如果采用查询模式&#xff0c;需要判断寄存器的数据&#xff0c;我的写法比较简单…