3Sums——Leetcode 0015三数之和_枚举类方法

算法基础之数组双指针(Leetcode题型归纳) 数组双指针(Leetcode题型归纳)1.前言2.双指针基础3.相向双指针3.1定义3.2真题分析3.2.1两数之和(1)3.2.2两数之和-输入有序数组(167)3.2.3三数之和(15)3.2.4最接近的三数之和(16)3.2.5四数之和(18)3.2.6盛最多水的容器(11)3.2.7有效三角形的个数(611)4.同向双指针-快慢指针4.1定义4.2真题分析4.1.1删除排序数组中的重复项(26)4.1.2移除元素(27)4.1.3删除排序数组中的重复项(80)4.1.4移动零(283)4.1.5数组 阅读详情

题目描述

Given an integer array nums, return all the triplets [nums[i], nums[j], nums[k]] such that i!=ji != ji!=j, i!=ki != ki!=k, and j!=kj != kj!=k, and nums[i]+nums[j]+nums[k]==0nums[i] + nums[j] + nums[k] == 0nums[i]+nums[j]+nums[k]==0.

Notice that the solution set must not contain duplicate triplets.

Example 1:

Input: nums = [-1,0,1,2,-1,-4]
Output: [[-1,-1,2],[-1,0,1]]

Example 2:

Input: nums = []
Output: []

Constraints:

0<=nums.length<=30000 <= nums.length <= 30000<=nums.length<=3000
−105<=nums[i]<=105-10^5 <= nums[i] <= 10^5−105<=nums[i]<=105

解题思路

直接基于三层循环的思路

无论是算法新手还是老司机,这个方法应该都是极易想到并且理解的。设定三层循环,找到其所有的元素个数为3的子集并完成子集合并即可实现,找到其中和为0的子集即为最后结果。

def threeSum_General(self, nums: List[int]) -> List[List[int]]:
    # 元素数目小于3个,不存在解
    if len(nums) < 3:
        return []
    # 元素个数刚好为3个,如果恰好为0,则为
    if len(nums) == 3:
        if sum(nums) == 0:
            return [nums]
        else:
            return []
    # 元素个数>3个
    result = []
    # 3层循环
    for i in range(0, len(nums)):
        for j in range(i + 1, len(nums)):
            for k in range(j + 1, len(nums)):
                # 判断是否和为零
                if nums[i] + nums[j] + nums[k] == 0:
                    # 满足条件的话对三个元素进行排序,并检查在结果集合中是否已经存在该结果
                    temp = sorted([nums[i], nums[j], nums[k]])
                    # 如果还不存在该解,将其加入最终的解集
                    if temp not in result:
                        result.append(list(temp))
    return result

但是在使用上述方法时,leetcode直接就报了超时的错误。不难理解,即便数组长度范围限制在3000以内,这种O(N3)O(N^3)O(N3)的解法的耗时也是极其可观的。为此,只能另寻别路。

先排序,再循环的解决方法

之所以考虑先排序,是因为在上述的做法中我们每一步都要做一次排序的工作,因此不如直接对整个数组做排序,随后采用三层循环的方案。这样子可以直接保证三个数字的顺序,代码如下:

def threeSum_Sort(self, nums: List[int]) -> List[List[int]]:
    # 元素数目小于3个,不存在解
    if len(nums) < 3:
        return []
    # 元素个数刚好为3个,如果恰好为0,则为
    if len(nums) == 3:
        if sum(nums) == 0:
            return [nums]
        else:
            return []
    # 元素个数>3个
    result = []
    # 3层循环
    nums = list(sorted(nums))
    for i in range(0, len(nums)):
        if i == 0 or nums[i] != nums[i - 1]:
            for j in range(i + 1, len(nums)):
                if j == i + 1 or nums[j] != nums[j - 1]:
                    for k in range(j + 1, len(nums)):
                        if k == j + 1 or nums[k] != nums[k - 1]:
                            # 判断是否和为零
                            if nums[i] + nums[j] + nums[k] == 0:
                                # 满足条件的话对三个元素进行排序,并检查在结果集合中是否已经存在该结果
                                temp = [nums[i], nums[j], nums[k]]
                                result.append(list(temp))
    return result

通过分析上述代码不难发现,这种先排序的方法并不会影响时间复杂度,因为三层循环的框架依旧在。那么如何才能摆脱三层循环的限制呢?官方的题解在分析时指出,在排序之后的数组numsnumsnums中枚举时,由于取到的三个数字在顺序上是升序的,在选定a,ba, ba,b之后,有唯一的ccc满足a+b+c=0a+b+c=0a+b+c=0这一条件,那么下一次枚举时,对应找到b′,c′b', c'b′,c′,满足上述条件,由于此时b′>bb'>bb′>b,那么此时c′<cc'<cc′<c,因此内层的两个循环其实可以合并为一个,这正是我们在对数组进行排序后带来的新特性。这样一来,第一层枚举在最外层,内层的两层枚举变为了同一层,时间复杂度自然从O(N3)O(N^3)O(N3)变为O(N2)O(N^2)O(N2),而排序带来的复杂度为O(NLogN)O(NLogN)O(NLogN),在取渐进意义时其可以忽略,整体的时间复杂度记为O(N2)O(N^2)O(N2)。下面给出代码:

'''
既然上述方案会导致超时,只能另寻方法
基于双指针的方法,主要改进的思路在于,既然三层循环会带来O(N^3)的复杂度,那么必须想办法摒弃。
由于我们需要考虑最终集合中元素不会重复,一种简单的做法就是先对整个数组排序
在枚举过程中,如果前两个数字a, b一旦确定,那么就有唯一的c与之匹配使得a+b+c=0
而当b向右移动枚举到b'时,由于b'>b,那么满足条件的c'<c也是必然的
因此b和c的枚举可以放到同一层循环,b由小到大,c由大到小
'''
def threeSum(self, nums: List[int]) -> List[List[int]]:
    if len(nums) < 3:
        return []
    if len(nums) == 3:
        if sum(nums) == 0:
            return [nums]
        else:
            return []
    result = []
    # first sort the given array with time complexity O(NlogN)
    nums = list(sorted(nums))
    for i in range(0, len(nums)):
        # nums[i] != nums[i - 1]这一条件是为了排除连续两个相同的数字会被单一枚举对象连续用两次,从而导致重复
        # 下面的所有该判断都是同一目的
        if i == 0 or nums[i] != nums[i - 1]:
            # 第三层枚举所用指针初始化,从后往前
            k = len(nums) - 1
            # 第二层枚举
            for j in range(i + 1, len(nums)):
                # 此处判断与上一个判断目的相同
                if j == i + 1 or nums[j] != nums[j - 1]:
                    # 双指针在使用时需要判断两个指针的相对位置,右指针不能越过左指针
                    # 在指针j更新后,满足条件的k对应的索引势必比上次要小
                    while nums[i] + nums[j] + nums[k] > 0 and k > j:
                        k -= 1
                    # 如果k == j,此时会导致三个数中出现重复,不满足集合的特性,不能作为结果
                    if nums[i] + nums[j] + nums[k] == 0 and k != j:
                        result.append([nums[i], nums[j], nums[k]])
    return result

以上是三数之和问题使用枚举方法求解的基本步骤,大家有新的方法的话可以在评论区交流(上述内容主要来自Leetcode官解,这里只是为了自己记录一下刷题过程中的心得~)

Pytest 常见问题及其解决方案 Pytest 是一个强大且灵活的测试框架,但初学者在使用过程中难免会遇到各种问题。希望通过这篇文章,你能更好地应对常见的挑战,写出更高效、更稳定的测试代码。测试不是负担,而是保障。写好测试不仅能提高代码质量,还能让你在面对变更时更加从容自信。 阅读详情

相关推荐

从业10年的AI应用架构师:企业AI平台运营的4个核心经验,值得收藏

去年年底,我在某大型制造企业做AI咨询时,遇到了这样的场景:这不是个例。我接触过的10家企业中,有7家的AI平台都陷入了“技术自嗨”的陷阱——技术团队追求模型精度、功能完备性,却忽略了业务到底需要什么。如果你也遇到过类似问题:比如“模型准确率很高,但业务不买账”“AI项目上线后没人用”“投入产出比极低”,那么这篇文章的4个经验,可能会帮你避开这些坑。很多企业认为,AI平台就是“买一套工具+部署几个模型”。但实际上,企业AI平台的本质是“技术与业务的连接生态”:根据Gartner的报告,80%的企业AI项目失

AI 原生应用开发的博客 709

【数据结构基础_数组】Leetcode 15.三数之和

双指针

cwtnice的博客 238

量子密钥分发(QKD)原理、工程实现与实战部署全解析

密钥分发是信息安全的核心基础,它解决了通信双方如何安全共享秘密密钥的难题。传统方法依赖于数学问题的计算复杂性,而量子密钥分发(QKD)则基于量子力学原理,为密钥分发提供了信息论安全的物理保障。其核心价值在于,利用量子不可克隆定理和测量坍缩原理,使得任何窃听行为都会被合法通信方检测到,从而在理论上实现无条件安全的密钥协商。这项技术特别适用于对安全性要求极高的场景,如金融数据同步、政务专网和电力系统保护。本文聚焦于量子保密通信,深入剖析了以BB84协议为代表的QKD工作原理,并详细拆解了包含单光子探测、偏振编码

weixin_29324401的博客 346

力扣-15三数之和3Sums

题目 例子 思路 代码

qq_37299596的博客 282

博图软件V15.1安装教程

博途软件安装

m0_46266496的博客 1万+

超实用!用ChimeraX对AlphaFold 结果可视化(中): 蛋白结构美化篇

而一般需要的背景颜色是无色(白色),有三种方法可以更改背景颜色,这里我们介绍两种方法,第三种在下一小节中讲解。如果想选中蛋白链中的某一结构区域或者某些位点,可以用Ctrl+Shift+鼠标左键,或在软件窗口中点击。在这个窗口中可以对蛋白的主链、侧链、表面等颜色进行修改,只用在。,即可在右下角看到我们蛋白的序列信息,在这里面直接用鼠标选择要选择的结构域。就会有更多的颜色供我们选择,如果有特定的色号还可以在这个界面继续选择。后面的颜色(②),就可以选择想要的任何背景颜色(③)。就可以选择软件推荐的常用颜色。

m0_63153079的博客 5485

算法:3个数之和15. 3Sum

15. 3Sum Given an integer array nums, return all the triplets [nums[i], nums[j], nums[k]] such that i != j, i != k, and j != k, and nums[i] + nums[j] + nums[k] == 0. Notice that the solution set must not contain duplicate triplets. Example 1: Input: nums =

AI架构师易筋 333

4.无限共轭距柯克物镜设计——zemax学习笔记

无限共轭cooker物镜

fly_daerm的博客 1596

15. 3Sum

刷题笔记 15. 3Sum 题目 Given an integer array nums, return all the triplets [nums[i], nums[j], nums[k]] such that i != j, i != k, and j != k, and nums[i] + nums[j] + nums[k] == 0. Notice that the solution set must not contain duplicate triplets. 思路 又是一道没自己做出来的

weixin_43914325的博客 267

SCI、中科院1区算法应用:(BWO-CNN-BiGRU-Attention)白鲸优化深度学习-融合注意力机制预测程序代码!包含特征可视化,数据Excel导入,直接运行!

BWO 白鲸优化算法,于2022年发表在SCI、中科院1区期刊《Knowledge-Based Systems》上。我们利用该高创新算法对我们的CNN-BiGRU-Attention时序和空间特征结合-融合注意力机制的回归预测程序代码中的超参数进行优化。

weixin_48747334的博客 3263

【异常】出现“‘git‘ 不是内部或外部命令,也不是可运行的程序”的错误

出现“‘git’ 不是内部或外部命令,也不是可运行的程序”的错误通常意味着 Git 没有被正确安装在你的系统上,或者其可执行文件的路径没有被添加到系统的环境变量中。

奶爸的编程之路,也就一周冷个三天 1391

【LeetCode 面试经典150题】15. 3Sum 三数之和

ji!= k, andj!= k, and。

qq_43513394的博客 596

YOLOv11【第三章:高阶应用与落地篇·第7节】多任务联合训练(Multi-Task Learning):检测+分割+关键点三头并进!

🏆 本文收录于专栏 《YOLOv11实战:从入门到深度优化》。本专栏围绕 YOLOv11 的改进、训练、部署与工程优化 展开,系统梳理并复现当前主流的 YOLOv11 实战案例与优化方案,内容目前已覆盖 分类、检测、分割、追踪、关键点、OBB 检测 等多个方向。

**My Coding Family** 730

leetcode15三数之和

参考文章 代码:自己代码 参考代码: class Solution { public List<List<Integer>> threeSum(int[] nums) {// 总时间复杂度:O(n^2) List<List<Integer>> ans = new ArrayList<>(); if (nums == null || nums.length <= 2) return ans;

Mr.田的博客 359

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

3Sums

15. 3Sums 题目链接 题意 解法 代码 算法复杂度 要点 题目链接:15. 3Sums 题意 给出一个数组,求出该数组中所有和为给定值的三元组的集合 解法 在有序数组中可以从用两个端点开始的两个下标来逐步逼近目标和,因此可以先将给定数组排序,然后每次固定一个数,在剩下的区间用左右两个下标来逼近给定和。 代

helowow的博客 551

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

LeetCode之16----3Sums Closest

题目: Given an arraySofnintegers, find three integers inSsuch that the sum is closest to a given number, target. Return the sum of the three integers. You may assume that each input ...

defs6497的博客 194

【LeetCode】3Sum 解题报告

这道题凭我现有知识实在解答不上来,只好网上搜索解法,才发现 K Sum 是一类问题,但是网上没有比较简洁的代码,我想对于初学者来说,可能还是想先看看这道题怎么解,然后才有兴趣去看其扩展吧。 【题目】 Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Fin

跳出温水的青蛙 3万+

【每日一算法】20180403- 3Sums

Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero.Note: The solution set must not contain dupli...

90ed9e4f的博客 438

2Sums&3Sums

从来没刷算法题,但是突然感觉这样还是不完整,听从学长建议从leetcode下手,感受了一下2Sums和3Sums,觉得自己算法真是差太多了。。。 从2Sums说起 起手双循环,不出意料超时了,于是开始想可以优化的地方,当时想着要是能把所有的遍历过的值的信息储存起来,就可以遍历一遍了,但是我大概觉得这样换个vector储存好像没用,要找匹配的还是要再遍历。于是就没想法了。上网找答案,第一下找

u012876995的博客 664

【leetcode】3sums

Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero. Note: Elements in a triplet (a,b,c

唐辰砂的博客 990

3 sums题解

题干: Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero.Note: Elements in a triplet (a,b,c) must

zslomo的博客 545

【LeetCode】详解三数之和15. 3Sum Given an array nums of n integers, are there elements a, b, c in nums

文章目录前言正文原题:思路1:思路2:思路3:总结 前言 有一段时间没刷LeetCode了,发现有点生疏,临近大三,需要多刷题!通过这篇博客记录LeetCode15题三数之和的思路。 正文 原题: 链接:三数之和 Given an array nums of n integers, are there elements a, b, c in nums such that a + b + c ...

Qonent的博客 1773

leetcode 303: Range Sum Query - Immutable

Range Sum Query - Immutable Total Accepted: 696 Total Submissions: 2406 Difficulty: Easy Given an integer array nums, find the sum of the elements between indices i and j (i ≤ j), i

西施豆腐渣 5684

小白算法打卡第一天!!!LeetCode第一题:2sum & 3Sum

作者:wu_yan_zu 链接:https文章目录3sum题目:解法:排序 + 双指针算法流程Python3C++JAVA 3sum题目: Given an integer array nums, return all the triplets [nums[i], nums[j], nums[k]] such that i != j, i != k, and j != k, and nums[i] + nums[j] + nums[k] == 0. Notice that the solution set

燃烧吧秀发 367

Leetcode 题解 - 动态规划-数组区间(8):数组区间和

[LeetCode] Range Sum Query - Immutable 区域和检索 - 不可变 Given an integer arraynums, find the sum of the elements between indicesiandj(i≤j), inclusive. Example: Given nums = [-2, 0, 3, -5, 2, -...

qq_40320556的博客 851

LeetCode#15. 3Sum

15. 3Sum Given an integer array nums, return all the triplets [nums[i], nums[j], nums[k]] such that i != j, i != k, and j != k, and nums[i] + nums[j] + nums[k] == 0. Notice that the solution set must not contain duplicate triplets. Example 1: Input: nums =

ashtime 141
上一篇: Knight On the Chessboard
下一篇: TrailingZeros——Leetcode 0172 寻找尾零的数目
CAAT9
博客等级 码龄10年 21粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值