leetcode15. 三数之和

Java实现 LeetCode 15 三数之和 15. 三数之和 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。 注意:答案中不可以包含重复的三元组。 示例: 给定数组 nums = [-1, 0, 1, 2, -1, -4], 满足要求的三元组集合为: [ [-1, 0, 1], [-1, -1, 2] ] 来源:力扣(Leet... 阅读详情

题目

给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。

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

示例 1:

输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]

题解

能用哈希表吗?

两数之和

出于之前两数之和,就会往哈希表方面想,两数之和是判断数组中是否有两个数之和等于target,则可以利用哈希表,遍历一次数组,对于每个nums[i],判断哈希表中有没有target-nums[i],有的话就找到答案了,没有的话就将nums[i]设置为哈希值,这样依次迭代,就能找到答案

利用哈希表的话,两层for循环就能确定a, b了,剩下的就是找c了,也就是-a-b了,理论上利用哈希表找的话是可以的,但是题目中说到不能包含重复的三元组,但是利用哈希表就会存在元素重复出现的问题,比如,现在a = -1, b = 2, 那就得找c = -1,但是目前哈希表已经有把a = -1这个设置为哈西值了,所以会找到-1,所以就出现了a这个元素出现两次的情况,所以利用哈希表就得去重,但似乎很麻烦(我太菜了,学不会!)

综上,用哈希表不太适合

排序 + 双指针

  • 先数组排序
  • 两层for循环,确定a, b,再在剩余元素中查找c,
  • 找c的过程是从数组最后一个元素遍历,循环至c的值小于或等于-(a + b),此时因为数组是排序过的,所以大小关系是确定的
  • 如果没有找到的话,即b之后的元素都会大于-(a + b) ,证明此时a必不可能会出现三数之后等于0的,因为a存在时,b和c取a后面的元素,都会大于0,所以直接跳出第二层for循环
为什么要排序?

排序的话是为了确定第三个元素,如果不排序的话,就得遍历a,b后面的全部元素,时间复杂度就会上升

复杂度分析
  • 时间复杂度

    • 第一层循环确定a的值,需要全部遍历元素,所以复杂度为O(n)
    • 第二层使用了双指针确定两个数的值,每次遍历移动左边的元素一次,移动最右边的元素若干次,均摊下来的话复杂度也为O(n)
    • 两层合起来的时间复杂度是O(N ^ 2),由于排序的复杂度是O(nlogn),小于n ^ 2,所以,总的时间复杂度是O(N ^ 2)
  • 空间复杂度

    O(logN),为排序时所消耗的

具体代码
/**
 * @param {number[]} nums
 * @return {number[][]}
 */
var threeSum = function(nums) {
    const len = nums.length
    if(len < 3) return []
    const res = []
    nums.sort((a, b) => a - b)

    for(let i = 0; i < len - 2; i++) {
        if(nums[i] > 0) break
        if(i > 0 && nums[i] == nums[i - 1]) continue
        const target = -nums[i]
        for(let j = i + 1; j < len; j++) {
            if(j != i + 1 && nums[j] == nums[j - 1]) continue
            let k = len - 1
            while(j < k && nums[j] + nums[k] > target) {
                k--
            }
            if(k == j) break  // 表示当前j加上后面任何数都不小于target, 可以直接break,因为j之后的数都不小于j,所以不可能会出现等于target的情况!
            
            // 找到的情况
            if(nums[j] + nums[k] == target) {
                res.push([nums[i], nums[j], nums[k]])
            }
        }
    }

    return res
};
LeetCode-15 三数之和 - 力扣 给你一个整数数组nums,判断是否存在三元组满足i!= ji!= k且j!= k,同时还满足。请你返回所有和为0且不重复的三元组。答案中不可以包含重复的三元组。不同的三元组是 [-1,0,1] 和 [-1,-1,2]。注意,输出的顺序和三元组的顺序并不重要。[]唯一可能的三元组和不为 0。[[0,0,0]]唯一可能的三元组和为 0。 阅读详情

相关推荐

【中等】力扣算法题解析LeetCode15:三数之和

本文介绍了如何高效找出数组中所有和为0的三元组。通过排序数组后固定一个数,使用双指针技术搜索剩余两数,确保解的唯一性。关键步骤包括跳过重复元素和提前终止无效搜索。该方法时间复杂度为O(n²),空间复杂度O(1)。

ylumwd的博客 463

leetcode 力扣 15 三数之和

【代码】leetcode 力扣 15 三数之和。

douzi657的博客 356

用Spirent Test Center测试交换机Head of Line(HOL)Blocking

测试目的:设备执行拥塞控制,使非阻塞端口不受阻塞端口影响 预设条件:在RFC2889里按以下步骤设置,端口1和端口3同时向端口4发送数据包,端口1向端口2发送数据包 测试步骤:运行设置好的RFC2889 测试结果:所有frame size都显示没有Head of Line(HOL),即非阻塞端口不受阻塞端口所影响 ...

Yuna_的博客 1358

力扣15三数之和,力扣18三数之和

力扣15三数之和,力扣18三数之和

weixin_69452463的博客 938

SPD5 集线器协议内容解析

​ 若不同SPD5 Hub后面的本地侧设备同时发送请求,则是22和23、24的混合过程,先通过LID裁决,再通过HID裁决,这里的LID是本地设备的,若LID一致,则看HID,由于SPD5 Hub的本地侧设备HID均为111,因此实际上是比较SPD5 Hub的HID,这个过程在前文提到,SPD5 Hub会转换HID。​ 若MR27[4]=1且MR27[3:0]=1,如果MR51[3:0]=1时,发送IBI,并且MR48[7]置1,将GETSTATUS CCC的待处理中断位[3:0]更新为0001。

weixin_50591344的博客 3860

YOLOv11改进 | 损失函数改进篇 | MPDIoU、InnerMPDIoU助力细节涨点(二次创新 + 代码解析)

本文为读者详细介绍了YOLOv11模型的最新改进,带来的改进机制是最新的损失函数MPDIoU和融合了最新的Inner思想的InnerMPDIoU(效果打爆之前的所有的损失函数提升检测精度和处理细节方面的作用。通过深入探讨MPDIoU和InnerMPDIoU(全网首发)的工作原理和实际代码实现,本文旨在指导读者如何将这些先进的损失函数技术应用到YOLOv11模型中,以提高其性能和准确性。文章内容涵盖从理论基础、代码实现,到实际教你如何添加本文的机制到你的模型中。

Snu77的博客 4026

力扣LeetCode第15题三数之和

力扣LeetCode第15题三数之和

weixin_44061444的博客 425

10分钟搞定manim安装与vscode配置

manim安装与vscode配置

帅帅de三叔 3413

力扣【LeetCode】—— 15. 三数之和【java】

题目链接:https://leetcode-cn.com/problems/3sum/ 题目:  给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。 注意:  答案中不可以包含重复的三元组。 示例:  给定数组 nums = [-1, 0, 1, 2, -1, -4],  返回:[[-1, 0, 1],[-1, -1, 2]] 该题目的难点是如何保证不重复,因为题目中要求“不可以包含重复的

眉头的骰 747

Android PMS——概述(一)

PMS(Package Manager Service)是 Android 操作系统的一个重要组件,它负责管理应用程序的包信息以及与应用程序的安装、卸载、权限控制等相关功能,确保应用程序的安全性和稳定性。 Android PMS 负责维护一个应用程序包的清单信息,该清单是一个 XML 文件,包含应用程序的各种元数据,例如应用程序的包名、版本号、权限要求、组件信息等。PMS通过访问该清单文件来获取应用程序的信息。 此外,Android PMS 还负责应用程序的安装和卸载。在安装应用

小旭的专栏 1668

【表面缺陷检测】基于yolov5的钢轨表面缺陷检测(附代码和数据集,Windows系统)

【表面缺陷检测】基于yolov5的钢轨表面缺陷检测(附代码和数据集,Windows系统)

学无止境、积少成多、厚积薄发 3984

力扣(LeetCode)15. 三数之和(C++/C语言)

【墨染】不想暴力递归怎么办?用对撞指针干掉超时。

墨染 2473

一网打尽身份验证与授权:深入剖析ASP.NET Core Identity在C#中的全方位实战应用

ASP.NET Core Identity 是 Microsoft 提供的一个强大且可扩展的身份验证和授权框架,用于构建基于用户账户、角色和权限的Web应用程序。它提供了用户注册、登录、密码管理、多因素认证、角色分配、授权等功能,与ASP.NET Core框架深度集成,简化了安全相关的开发工作。通过上述代码示例和注释,展示了如何安装配置Identity、自定义用户实体与数据库上下文、实现用户注册登录、管理角色与用户角色关系,以及如何使用授权策略保护应用程序资源。,并指定用户和角色类型以及主键类型。

java专栏 1530

15. 三数之和(力扣LeetCode)

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i!这么写就是当前使用 nums[i],我们判断前一位是不是一样的元素,在看 {-1, -1 ,2} 这组数据,当遍历到 第一个 -1 的时候,只要前一位没有-1,那么 {-1, -1 ,2} 这组数据一样可以收录到 结果集里。但这里有一个问题,是判断 nums[i] 与 nums[i + 1]是否相同,还是判断 nums[i] 与 nums[i-1] 是否相同。所以这种去重 是可以不加的。

m0_73841621的博客 1412

【车载以太网】【SOMEIP】Wireshark测试someip

一、 Wireshark SOMEIP plugin 1.1 插件安装 Wireshark插件目录:Help -> About Wireshark -> Folders/Pluginshttps://github.com/jamores/eth-ws-someip 解压后,将所有后缀是lua的文件拷贝到Wireshark安装目录plugins/2.4.10/下。 1.2时间戳调整为UTC显示格式 View -> Time Display Format -> Date and Tim.

专注汽车软件开发、AutoSAR、车载以太网、SOA、EE架构。 9726

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

力扣第15题:三数之和

学习目标: 力扣15. 三数之和 学习内容: 给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。 注意:答案中不可以包含重复的三元组。 示例: 给定数组 nums = [-1, 0, 1, 2, -1, -4], 满足要求的三元组集合为: [ [-1, 0, 1], [-1, -1, 2] ] 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/prob

童一的博客 334

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

day29【LeetCode力扣】15.三数之和

这是因为在内层循环中,我们会尝试找到和为0的三元组,如果当前元素和前一个元素相同,那么它们组成的三元组在上一次内层循环中已经考虑过,因此这里直接跳过,避免重复计算。实际上,对于这道题目而言,采用哈希方法并不是一个最佳选择,因为在去重过程中涉及到的细节较多,而在面试环境中很难立即编写出没有缺陷的代码。如果 c 在 set 中,则找到一个有效的三数之和,将其添加到结果向量中,并从 set 中删除 c,以避免重复添加相同的解。

canGfly的博客 1242

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

15. 三数之和 - 力扣(LeetCode)

计算最大可能和:nums[i] + nums[-1] + nums[-2] = -4 + 2 + 1 = -1 < 0,说明无法找到和为0的组合,直接跳过。计算最小可能和:nums[i] + nums[i+1] + nums[i+2] = -4 + (-1) + (-1) = -6 < 0,继续。经过上述步骤,结果列表 res 中包含两个三元组:[ -1, -1, 2 ] 和 [ -1, 0, 1 ],与预期输出一致。预期输出:[[ -1, -1, 2 ], [ -1, 0, 1 ]]

q1111111da的博客 966

力扣(LeetCode) ——15.三数之和(C++)

解题思路包括:1)排序预处理;2)固定一个元素后使用双指针寻找匹配的另外两个元素;3)去重处理避免结果重复。通过双指针优化,算法时间复杂度为O(n²),空间复杂度O(log n)。

专注 C++ 后端开发与 Linux 系统编程,深耕 STL 原理、多线程、内存管理、网络编程与服务端开发。用通俗语言拆解晦涩知识点,持续输出高质量学习笔记、踩坑复盘与面试干货。 980

力扣——15三数之和

不同的三元组是 [-1,0,1] 和 [-1,-1,2]。15. 三数之和 - 力扣(LeetCode)注意,输出的顺序和三元组的顺序并不重要。答案中不可以包含重复的三元组。唯一可能的三元组和不为 0。唯一可能的三元组和为 0。,判断是否存在三元组。

2301_77433167的博客 1100

LeetCode 15三数之和

LeetCode 15三数之和 题目简述:给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。注意:答案中不可以包含重复的三元组。 输入:nums = [-1, 0, 1, 2, -1, -4] 输出:[ [-1, 0, 1], [-1, -1, 2]] 思路: 将nums数组排序,先依次枚举固定一个数nums[i],利用双指针left和right指向数组首尾查找另外两数 当le

XBlog 189

LeetCode第15题_三数之和

这道题的关键点:排序的重要性去重的处理双指针的应用优化思路:提前判断边界条件计算可能的最值进行剪枝减少不必要的遍历注意事项:数组为空或长度小于3的情况重复元素的处理整数溢出的可能。

qq_40263592的博客 1177

【力扣LeetCode】15 三数之和

题目描述(难度中) 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。 注意:答案中不可以包含重复的三元组。 例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4], 满足要求的三元组集合为: [ [-1, 0, 1], [-1, -1, 2] ] 链接 https:...

Jiewang的博客 266

力扣15:三数之和

力扣第15题双指针C解法,运行时间0ms,打败100%!

weixin_48941116的博客 1138

LeetCode15-三数之和

LeetCode15-三数之和 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。 注意:答案中不可以包含重复的三元组。 例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4], 满足要求的三元组集合为: [ [-1, 0, 1], [-1, -1, 2] ]...

lyd1995的博客 229

力扣15.三数之和(java)

力扣15.三数之和题目思路代码 LeetCode笔记汇总 题目 给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。 注意:答案中不可以包含重复的三元组。 示例 1: 输入:nums = [-1,0,1,2,-1,-4] 输出:[[-1,-1,2],[-1,0,1]] 示例 2: 输入:nums = [] 输出:[] 示例 3: 输入:nums = [0] 输出:[] 提示: 0 <=

k_surge的博客 453
上一篇: vue源码之数据侦测
下一篇: leetcode122. 买卖股票的最佳时机||
Lin__hr
博客等级 码龄6年 5粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值