题目

给你一个整数数组 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 。

解析

为方便双指针以及跳过相同元素,先把 nums 排序。

枚举 nums[i],问题变成 nums[j]+nums[k]=−nums[i]。

题目要求答案中不能有重复的三元组。如何避免重复?

在外层循环中,如果发现 nums[i]=nums[i−1],那么 nums[i] 与后面两个数组成的和为 0 的三元组,nums[i−1] 也能组成一模一样的三元组,这就重复了,所以遇到 nums[i]=nums[i−1] 的情况,直接 continue。

在内层循环中,当三数之和等于 0 时,为避免把相同的三元组计入答案,跳过后续相同的 nums[j] 和 nums[k](也可以只跳过相同的 nums[j])。

优化
优化一:如果 nums[i] 与后面最小的两个数相加 nums[i]+nums[i+1]+nums[i+2]>0,那么后面不可能存在三数之和等于 0,break 外层循环。

优化二:如果 nums[i] 与后面最大的两个数相加 nums[i]+nums[n−2]+nums[n−1]<0,那么内层循环不可能存在三数之和等于 0,但继续枚举,nums[i] 可以变大,所以后面还有机会找到三数之和等于 0,continue 外层循环。

------------------------------------------------

作者:灵茶山艾府
链接:https://leetcode.cn/problems/3sum/
来源:力扣(LeetCode)

答案

/*** @param {number[]} nums* @return {number[][]}*/
var threeSum = function(nums) {nums.sort((a,b) => a-b);    //排序const ans = [];const len = nums.length;for(let k=0; k<len-2; k++) {//和前一个数相同,那么后面能组成0的两个数的答案相同,跳过该数if(k>0 && nums[k] === nums[k-1]) continue;//和后面两个最小的数之和都大于0,不可能找到等于0的两个数,跳出for循环if(nums[k] + nums[k+1] + nums[k+2] > 0) break;//和最后两个最大的数之和都小于0,内层循环固定位的数太小,回到外层循环找更大的数if(nums[k] + nums[len-2] + nums[len-1] < 0) continue;let i = k+1, j=len-1;while(i < j) {const s = nums[k] + nums[i] + nums[j];if(s < 0) {    //换更大的加数i++;} else if(s > 0) {    //换更小的加数j--;} else {ans.push([ nums[k], nums[i], nums[j]]);    //等于0,加入答案for(i++; i<j && nums[i] === nums[i-1]; i++);    //跳过重复的数for(j--; j>i && nums[j] === nums[j+1]; j--);    //跳过重复的数}}}return ans;
};

复杂度分析

时间复杂度:O(n^2),其中 n 为 nums 的长度。排序 O(nlogn)。外层循环枚举第一个数,做法是 O(n) 双指针。所以总的时间复杂度为 O(n^2 )。
空间复杂度:O(1)。返回值不计入。忽略排序的栈开销。

------------------------------------------------

作者:灵茶山艾府
链接:https://leetcode.cn/problems/3sum/
来源:力扣(LeetCode)

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

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

相关文章

银行回单识别应用场景剖析

银行回单OCR识别技术通过自动化处理纸质或电子回单中的关键信息&#xff0c;显著提升了金融、企业及个人场景下的数据管理效率。以下是其核心应用场景及价值的详细剖析&#xff1a;一、企业财务场景自动化账务处理对账与记账&#xff1a;OCR自动提取交易日期、金额、账号等信息…

React的介绍和特点

1. React是什么&#xff1f; 1.1. React&#xff1a; 用于构建用户界面的JavaScript库1.2. React的官网文档&#xff1a;https://zh-hans.reactjs.org/ 2. React的特点2.1. 声明式编程&#xff1a; 目前整个大前端开发的模式&#xff1a;Vue、React、Flutter、SwiftUI只需要维护…

内核smmu学习

思考 smmu对外提供功能&#xff0c;设备驱动调用smmu 提供的api来配置页表&#xff0c;那其他设备是如何和smmu交互的&#xff1f;iommu 作为将不同smmu硬件的一个抽象封装&#xff0c;其它设备应该只能看到iommu这个封装层&#xff0c;那么iommu这个子系统是如何进行抽象的&a…

Android Slices:让应用功能在系统级交互中触手可及

引言 在当今移动应用生态中&#xff0c;用户每天要面对数十个甚至上百个应用的选择&#xff0c;如何让自己的应用在关键时刻触达用户&#xff0c;成为开发者面临的重要挑战。Google在Android 9 Pie中引入的Slices技术&#xff0c;正是为了解决这一痛点而生。本文将全面介绍And…

python学智能算法(三十))|SVM-KKT条件的数学理解

【1】引言 前序学习进程中&#xff0c;通过类比力的平衡对KKT条件进行了初步的理解。 今天我们更进一步&#xff0c;常使用数学语言进一步解释KKT条件。 【2】带约束的最小优化问题 首先定义一个即将求解的优化问题&#xff1a; 目标函数&#xff1a;最小化f(x)(x∈Rn)f(x)(…

华为云Flexus+DeepSeek征文|Linux命令实现两种部署的性能捕获+(硅基+Maas)模型添加教学

前引&#xff1a;“在数字化浪潮汹涌澎湃的今天&#xff0c;企业对云计算服务的需求已从基础架构支撑&#xff0c;逐步转向更深层次的AI赋能与业务创新驱动。面对复杂多变的市场环境&#xff0c;选择一个强大、可靠且具备前瞻性的云服务伙伴&#xff0c;无疑是企业实现高速增长…

langchain--1--prompt、output格式、LCEL示例

环境&#xff1a;本地使用ollama部署的deepseek-r1:1.5b模型 本文示例包含: [1] 非LCEL的调用方法[2] LCEL的调用方法[3] prompt template的简单使用&#xff0c;除了PromptTemplate模板&#xff0c;还有一些其它模板&#xff0c;可去查看官网[4] 输出&#xff1a;json格式、py…

【算法】指数滑动滤波器

指数滑动滤波器作用原理特点公式代码优化升级作用 首先这个滤波器能够将一些突变的信号对系统的影响降低&#xff0c;能够平滑输入信号&#xff0c;滤除噪声&#xff0c;减少测量数据的瞬间波动和干扰&#xff0c;就是实现输入信号不能不变&#xff0c;数值不会突然变大&#…

STM32F4—电源管理器

Power supply schemesPower supply supervisorInternal reset ON有PDR_ON pin的MCU&#xff0c;PDR_ON pin被拉高的时候电源监视器被使能。没有PDR_ON pin的MCU默认一直使能。内部集成了power-on reset (POR) / power-down reset (PDR)POR&#xff08;上电复位&#xff09;&…

MySQL锁的分类 MVCC和S/X锁的互补关系

各位看官&#xff0c;大家早安午安晚安呀~~~如果您觉得这篇文章对您有帮助的话欢迎您一键三连&#xff0c;小编尽全力做到更好 欢迎您分享给更多人哦今天我们来学习&#xff1a;MySQL锁的分类 && MVCC和S/X锁的互补关系1.锁分类1.按锁粒度分类&#xff1a;全局锁&#…

第五届智能通信与计算国际学术会议(ICICC 2025)

重要信息 官网&#xff1a;www.ic-icc.org 时间&#xff1a;2025年8月15-16日 地点&#xff1a;中国 南京 第五届智能通信与计算国际学术会议(ICICC 2025&#xff09;定于2025年8月15-16日在中国 南京举行。随着信息技术的飞速发展&#xff0c;智能通信与计算领域的研究与…

基于C#和NModbus4库实现的Modbus RTU串口通信

基于C#和NModbus4库实现的Modbus RTU串口通信&#xff0c;包含完整的界面设计和功能实现&#xff1a;一、项目依赖配置NuGet包安装&#xff1a; Install-Package NModbus4 Install-Package System.IO.Ports窗体控件布局&#xff1a; <!-- 基础控件配置 --> <ComboBox …

想要批量提取视频背景音乐?FFmpeg 和转换器都安排上

你是否遇到过这样的情况&#xff1f;看到一个超赞的短视频&#xff0c;里面的背景音乐特别好听&#xff0c;想单独保存下来当手机铃声或收藏&#xff0c;却不知道怎么把音乐从视频里“抠”出来&#xff1f;别担心&#xff01;今天就为大家分享两种简单易行的方法&#xff0c;无…

为什么MCP协议是AI集成的未来API

一、企业AI应用的核心挑战与架构演进 当前企业AI落地面临三大核心痛点&#xff1a; ​​系统集成困境​​&#xff1a;需对接企业内部业务系统&#xff08;CRM/ERP等&#xff09;​​异构环境兼容​​&#xff1a;需整合第三方AI服务与传统API​​数据孤岛突破​​&#xff1…

Apache Tomcat样例目录session操纵漏洞解读

【漏洞名称】&#xff1a;Apache Tomcat样例目录session操纵漏洞 &#xff08;Apache Tomcat示例目录漏洞&#xff09;【漏洞等级】&#xff1a;中危&#xff0c;5.9分。【漏洞描述】Apache Tomcat默认安装页面中存在examples样例目录&#xff0c;里面存放着Servlets、JSP、Web…

Go语言实战案例:实现HTTP客户端请求并解析响应

本文是 Go 网络与并发实战系列的第2篇&#xff0c;聚焦于如何使用 Go 实现一个 HTTP 客户端&#xff0c;完成请求发送、响应解析、错误处理、Header与Body提取等完整流程。一、前言&#xff1a;为什么学习HTTP客户端&#xff1f;在日常开发中&#xff0c;无论是调用 RESTful AP…

java的冒泡排序算法

冒泡排序是一种简单的排序算法&#xff0c;通过重复遍历待排序序列&#xff0c;比较相邻元素并在必要时交换位置&#xff0c;最终实现排序。以下是Java实现的详细说明&#xff1a;核心原理‌比较相邻元素‌&#xff1a;从序列第一个元素开始&#xff0c;逐对比较相邻元素的大小…

玻尔兹曼分布与玻尔兹曼探索

目录 玻尔兹曼分布定义 玻尔兹曼探索&#xff1a; 1. 玻尔兹曼分布公式 2. 温度 T 如何影响采样结果&#xff1f; (1) 高温 (T→∞)&#xff1a; (2) 低温 (T→0)&#xff1a; (3) 中等温度 (T∈(0,∞))&#xff1a; 3. 直观示例 4. 实际应用中的意义 5.核心误区澄清…

【工具】jsDelivr CDN完全指南:免费高速的开源项目CDN服务

前言 在现代Web开发中&#xff0c;内容分发网络&#xff08;CDN&#xff09;已经成为提升网站性能的重要工具。jsDelivr作为一个免费、快速、可靠的开源CDN服务&#xff0c;为全球开发者提供了优质的静态资源分发服务。无论是加速GitHub仓库访问、分发npm包&#xff0c;还是为…

OSPF笔记整理

一、OSPF 基础特性1. 技术背景&#xff08;对比 RIP&#xff09;RIP 的缺陷&#xff1a;最大跳数 15 限制、周期性发送全路由表&#xff08;占用带宽&#xff09;、收敛慢、以跳数为度量值、易产生环路、30 秒更新间隔。OSPF 的改进&#xff1a;无跳数限制&#xff08;支持大规…