三数之和力扣--15

embedded/2025/1/19 5:50:19/

目录

题目

思路

代码


题目

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

思路

这道题的关键在于去重

用哈希表写有很多去重细节,难以一次到位

所以采用双指针法

先把这个数组排序(从小到大),用i遍历数组中每一个数字,left指向i+1,right指向length-1,然后三个数相加,如果等于0, 那么添加,如果大于0,那么right--;如果小于0,那么left++。

接下来是去重的问题

 对于a的去重,是要判断 nums[i] 与 nums[i + 1]是否相同,还是判断 nums[i] 与 nums[i-1] 是否相同?

 如果和他的后一个比较,那么会把三元组中只要有两个数字相同的结果集去掉,比如{-1, -1 ,2},符合要求,但是会被去掉,所以不能和后一个比较

不能有重复的三元组,但三元组内的元素是可以重复的!

我们判断前一位是不是一样的元素,在看 {-1, -1 ,2} 这组数据,当遍历到 第一个 -1 的时候,只要前一位没有-1,那么 {-1, -1 ,2} 这组数据一样可以收录到 结果集里。

对b和c去重也是类似的思路

代码

class Solution {public List<List<Integer>> threeSum(int[] nums) {List<List<Integer>> result=new ArrayList<>();//创建一个二维数组Arrays.sort(nums);//排序for(int i=0;i<nums.length;i++){if(nums[i]>0){//当第一个数都待遇0,那么没有符合要求的,直接返回return result;}if(i>0&&nums[i]==nums[i-1]){//去重continue;}int left=i+1;int right=nums.length-1;while(right>left){int sum=nums[i]+nums[left]+nums[right];if(sum>0) {right--;}else if(sum<0){left++;}else{result.add(Arrays.asList(nums[i], nums[left], nums[right]));//符合条件,添加while(right>left&&nums[right]==nums[right-1]){right--;}while(right>left&&nums[left]==nums[left+1]){left++;}left++;right--; }}}return result;}
}


http://www.ppmy.cn/embedded/155152.html

相关文章

Kibana:ES|QL 编辑器简介

作者&#xff1a;来自 Elastic drewdaemon ES|QL 很重要 &#x1f4aa; 正如你可能已经听说的那样&#xff0c;ES|QL 是 Elastic 的新查询语言。我们对 ES|QL 寄予厚望。它已经很出色了&#xff0c;但随着时间的推移&#xff0c;它将成为与 Elasticsearch 中的数据交互的最强大…

openharmony/build/README_zh.md学习

编译构建 简介目录约束与限制说明常见问题说明相关仓 简介 编译构建子系统提供了一个基于Gn和ninja的编译构建框架。 根据产品配置&#xff0c;编译生成对应的镜像包。其中编译构建流程为&#xff1a; 使用Gn配置构建目标。Gn运行后会生成ninja文件。通过运行ninja来执行编…

JAVA:利用 RabbitMQ 死信队列实现支付超时场景的技术指南

1、简述 在支付系统中&#xff0c;订单支付的超时自动撤销是一个非常常见的业务场景。通常用户未在规定时间内完成支付&#xff0c;系统会自动取消订单&#xff0c;释放相应的资源。本文将通过利用 RabbitMQ 的 死信队列&#xff08;Dead Letter Queue, DLQ&#xff09;来实现…

中间件 MetaQ

MetaQ&#xff08;全称Metamorphosis&#xff09;是一个高性能、高可用、可扩展的分布式消息中间件&#xff0c;其思路起源于LinkedIn的Kafka&#xff0c;但并不是Kafka的一个Copy。以下是关于MetaQ的详细介绍&#xff1a; 基本特性 • 高性能&#xff1a;具有消息存储顺序写、…

前端——换行

大家都知道<br />和\n是有换行的作用 很多时候&#xff0c;有些区分不开<br />和\n的区别&#xff0c;他俩各自在什么情形下使用呢 一、<br /> 在浏览器中&#xff0c;<br /> 会强制文本在当前位置换行。 适用于需要在特定位置插入换行的场景。 二、…

音频语言模型与多模态体系结构

音频语言模型与多模态体系结构 多模态模型正在创造语言、视觉和语音等以前独立的研究领域的协同效应。这些模型使用通用架构,将每种模式视为不同的“token”,使它们能够以一种与人类认知非常相似的方式联合建模和理解世界。 ​ ​可以将多模态分为两个主要领域:输入空间(…

WEB攻防-通用漏洞_XSS跨站_绕过修复_http_only_CSP_标签符号

目录 1、关卡361 - 反射型xss 2、关卡317 - 过滤标签 3、关卡318 319 - 过滤标签 4、关卡320--326 - 过滤空格和尖括号 5、关卡327 - 存储型跨站 6、关卡328 7、关卡329 - 失效凭据需1步完成所需操作 8、关卡330 - 存储型-借助修改密码URL重置管理员密码&#xff08;GE…

【Grasshopper】【Python】点集排序:带索引的Z字形排序算法

Grasshopper Python点集排序&#xff1a;带索引的Z字形排序算法 1. 功能介绍 这段代码实现了一个在Grasshopper中的点集排序功能&#xff0c;不仅可以将空间中的点按照Y坐标分组并在每组内按X坐标排序&#xff0c;还能追踪每个点的原始索引位置。 2. 输入输出参数 输入参数&…