leecode(15)三数之和

PyTorch GPU版本安装避坑指南:解决RuntimeError: No CUDA GPUs are available报错 本文详细解析了PyTorch GPU版本安装过程中常见的`RuntimeError: No CUDA GPUs are available`报错问题,从硬件驱动检查、CUDA Toolkit与cuDNN安装到PyTorch GPU版本的正确配置,提供了全面的避坑指南和实战验证方法,帮助开发者高效搭建深度学习开发环境。 阅读详情

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

尝试:第一种暴力法

    public List<List<Integer>> threeSum1(int[] nums){
            int n = nums.length;
            // 定义结果列表
            List<List<Integer>> result = new ArrayList<>();
            // 三重for循环,枚举所有的三数组合
            for (int i = 0; i < n - 2; i++){
                for (int j = i + 1; j < n - 1; j++){
                    for (int k = j + 1; k < n; k++){
                        if (nums[i] + nums[j] + nums[k] == 0)
                            result.add( Arrays.asList(nums[i], nums[j], nums[k]) );
                    }
                }
            }
            return result;
        }

此种解法时间复杂度是o(n^3),空间复杂度为O(n),并且答案也无法满足题目找出不重复的三元组,这个结果是不去重的,同样的三元组在结果中无法排除.比如-1,0,1会出现两次。而且时间复杂度非常高是O(N)的三次方,接下来试图做些改进,降低复杂度,而且解决去重问题
尝试2:运用哈希表(要做去重,首先想到就是把结果保存到hash表里。仿照两数之和,直接存到HashMap中查找)

    public List<List<Integer>> threeSum2(int[] nums){
        int n = nums.length;
        List<List<Integer>> result = new ArrayList<>();
        HashMap<Integer,List<Integer>> map = new HashMap<>();

        for(int i =0;i<n;i++){
            int thatNum = 0 - nums[i];
            //如果已经存在了thatNum,就找到了一组解
            if(map.containsKey(thatNum)){
                ArrayList<Integer> list = new ArrayList<>(map.get(thatNum));
                list.add(nums[i]);
                result.add(list);
            }
            //如果没找到,就把当前两个值添加到map
            for(int j = 0;j < i;j++) {
                int newKey = nums[i] + nums[j];
                //如果key不存在,就直接添加进去
                if (!map.containsKey(newKey)) {
                    ArrayList<Integer> list = new ArrayList<>();
                    list.add(nums[i]);
                    list.add(nums[j]);
                    map.put(newKey, list);
                }
            }
        }
        return result;
    }

因为尽管通过HashMap存储可以去掉相同二元组的计算结果的值,但没有去掉重复的输出(三元组)。这就导致,0对应在HashMap中有一个值(0,List(0,0)),第三个0来了会输出一次,第四个0来了又会输出一次。如果希望解决这个问题,那就需要继续加入其它的判断来做去重,整个代码复杂度会变得更高。可以尝试用set去解一下,不过思维打开了,把复杂度降下去了,为O(n^2),最后经过我的思考,我终于发现了一个非常好的解法
解法:双指针法

    public List<List<Integer>> threeSum3(int[] nums){
        int n = nums.length;
        List<List<Integer>> result = new ArrayList<>();
        Arrays.sort(nums);//-4 -1 -1 0 1 2

        //1.遍历每个元素,找到三个数的最小的那个作为核心
        for(int i = 0 ;i < n;i++){
            // 1.1 如果当前数已经大于0,直接退出循环
            if (nums[i] > 0 ) break;
            // 1.2 如果当前数据已经出现过,直接跳过
            if ( i > 0 && nums[i] == nums[i-1] ) continue;

            // 1.3 常规情况,以当前数做最小数,定义左右指针
            int lp = i + 1;
            int rp = n - 1;
            //当左右指针遇到时,结束循环
            while(lp < rp){
                int sum = nums[i] + nums[lp] + nums[rp];
                if (sum == 0){
                    // 1.3.1 等于0,就是找到了一组解
                    result.add(Arrays.asList(nums[i], nums[lp], nums[rp]));
                    lp ++;
                    rp --;
                    // 如果移动之后的元素相同,直接跳过
                    while (lp < rp && nums[lp] == nums[lp - 1]) lp++;
                    while (lp < rp && nums[rp] == nums[rp + 1]) rp--;
                }
                // 1.3.2 小于0,较小的数增大,左指针右移
                else if(sum < 0)
                    lp ++;
                    // 1.3.3 大于0,较大的数减小,右指针左移
                else
                    rp --;
            }
        }
        return  result;
    }

时间复杂度为O(n^2),比暴力法有了很大的改善,空间复杂度仅为O(1),可以说双指针一种很巧妙非常优雅的设计.

最后,关于第一个暴力法我是在是想不出有什么办法可以去重,如果你们有什么好的想法,欢迎来讨论.至此结束,别忘记关注哦,算法日常更新思路.

2025年全国青少年信息素养大赛初赛真题(算法创意实践挑战赛C++初中组:文末附答案) 阅读详情

相关推荐

【Proteus仿真】74HC595+74LS154驱动显示16X16点阵

【Proteus仿真】74HC595+74LS154驱动显示16X16点阵

perseverance51博客 2893

算法十五:三数之和

一天一算法。

weixin_40741512的博客 1万+

华为OD机考双机位C卷 - 池化资源共享 (Java & Python& JS & C/C++ & GO )

华为OD机考双机位C卷 - 池化资源共享 (OD上机考试双机位C卷)。提供Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。

算法大师! 1071

【数据结构与算法】三数之和

双指针思路解决三数之和,按该思路可扩展n数之和的求解。

Czh的博客 2378

IP-Guard分类管理详解

大家都知道在配置IPGUARD策略前需要做分类库进行设置和分类。 1、应用程序:可以分类,例如上班时间只能用OFFICE和WPS,记事本等办公软件,可以在分类里设置一个类 ;办公软件,在未分类里找到OFFICE,WPS等拖入心建的分类里就可以在配置策略里调用。 2、网站分类也不一样,可以按照自己方式自定义。也可以导入厂家已经收集到的网站分类。 3、邮箱分类:可以提前定义好一个或...

IP-Guard专栏 589

一文吃透 ABAP RESTful Application Programming Model(RAP):从数据建模与行为,到业务服务暴露,再到服务消费

本文介绍了SAP ABAP统一编程模型RAP的核心架构与实践方法,通过构建完整的ZTRAVEL和ZBOOKING业务对象,演示了从数据建模、行为定义到服务暴露的全流程。文章详细说明了RAP三层架构(数据与行为层、服务提供层、服务消费层)的实现方式,包括CDS视图实体定义、行为定义(BDEF)中的事务能力声明、投影与服务绑定等关键步骤。特别强调了ABAP Cloud环境下的开发限制和最佳实践,如使用GUID和late numbering机制,以及如何通过EML语言操作业务对象。最后提供了完整的代码示例,展示了

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 521

leetcode:15. 三数之和

题目来源 leetcode 题目描述 题目解析 题目分析 目的:要求从无序nums中找出3个数,正好和为0,要求求出所有的方案(不重复) 因为要求返回所有的方案,所以动态规划会比较麻烦,x掉。 暴力 从下面分析,可以知道,这是一个排列问题(跟顺序有关) 问题:我们需要从一个数组中选出三个数,有多少种组合?(每个nums[i]可以用无限次)(组合跟顺序没有关系) #include <iostream> #include <algorithm> #include <vec

OceanStar的博客 2686

1、语义数据建模:避免陷阱与突破困境

本文探讨了语义数据建模的兴起背景、核心概念、生命周期及常见挑战。从数据丰富型组织和AI开发者的需求出发,分析了语义建模的关键元素和质量维度,并深入讨论了建模过程中可能出现的陷阱与解决方案。文章还针对语义模型的演化、治理和战略组织问题提供了突破思路,旨在帮助数据从业者更好地理解和应用语义建模技术,以提升数据驱动应用的有效性。

c8d9e0f1的博客 119

三数之和的解法(附java和python代码)

三数之和、四数之和、最接近的三数之和

weixin_41221502的博客 5998

17track单号查询逆向分析

这就说明该网站很有可能存在其它检测点,而检测本地替换最大可能的就是检测了代码格式化或者代码长度。也一样,要么导致网站卡死,要么会导致网页加载异常,这里可能就难到不少人了,让我们一步一步解决。而这个站主要是检测了代码格式化,无限循环检测造成了网站卡死,经多次测试发现检测点共三处。方法中代码很长,但是经调试后发现,它其实只返回一个固定的值,这里直接写死即可。同样的,虽然看起来很长,但是跟过之后就会发现流程很简单,这里主要就是对。追加了一些值,是一条很长的语句,整理代码。,核心流程也很简单,稍微跟一下就出来了,

pyzzd的博客 1622

PCL 点云配准-ICP算法(精配准)

ICP(Iterative Closest Point)算法是一种常用的点云精细配准算法。它通过迭代计算将一组点云变换到另一组点云的最佳位置,最终实现精确的对齐。ICP算法在每次迭代中选择与目标点云最接近的点作为对应点,通过计算最小化源点云和目标点云之间的均方误差(MSE)来进行刚性变换(包括平移和旋转)。

纵马踏花向自由 1724

三数之和(去重)

去重算法 双指针

qq_61009660的博客 1207

精度与速度双突破:YOLOv8-Pose 在 RK3588 上实现高性能人体姿态分析部署

本教程从YOLOv8-pose模型的姿态识别训练,到RK3588的边缘量化部署,为你打造了一套“高精度+高实时性+低成本”的人体姿态分析解决方案。无论是健身动作纠正、智能安防行为检测,还是工业人员姿态监控,这套技术都能直接复用——你只需替换数据集与业务逻辑,即可快速落地专属的边缘AI姿态识别系统。如果你在实践中遇到任何卡点,欢迎随时交流。记住,人体姿态识别的价值在于“关键点准、推理快、部署易”,而这三者的平衡,正是你通过本教程能掌握的核心能力。

know_F0727的博客 434

leecode15——三数之和

n数之和

wish9968的博客 260

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Leecode15——三数之和(双指针)

1.这个题初看是有点像两数之和的,不过是把两次循环升维到了三层循环;2.降低三层循环复杂度的办法,如这里的双指针、哈希表等(不知道这里能不能用哈希表)优化;3.双指针的动作方式需要巧妙设计,引入人为的判断能加速算法;4.有的时候,对数组适当的预处理(排序、去重)也很重要,能简化算法逻辑。

qq_53507133的博客 1032

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Leecode 15三数之和

内层的while循环中,循环条件为 left < right,同样的,我们也需要对left 和 right 进行去重,那么如何去重呢,是进入循环时直接去重,还是找到一个三元组以后再去重呢?考虑一个刚开始便是[0,0,0]的三元组,若是再while循环刚开始对它进行去重的话,会导致left >= right ,从而漏过了这种情况,所以我们需要在找到一个三元组后,再进行去重。用双指针法,for循环中 , left = i+1,right = nums.size() -1;Leecode 15 .三数之和。

Stanly_的博客 322

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

leecode-15 三数之和

我的思路是定义一个left和一个right,然后在向集合里去查询,看看有没有除了nums[left],和nums[right]的第三个元素,把这个问题转换为一个遍历查找问题。当我们确定了第一个数,发现它和这个排序后的数组中最大的两个数相加都小于0的话,那么这个都不用看了,不可能会有等于0的情况,我们此时。之后我们对这个数组进行遍历,先确定一个数,之后再剩余的数组中,找到两个数的和为0-这个数,此时就和0167题相似了。我们可以通过先对这个数组进行排序,这样就和0167题具有了相同的初始条件,即数组有序。

everything_study的博客 386

leecode 15.三数之和

这个题目一拿到手我的想法是把这些数字分成正数和负数,因为如果要得到sum = 0的话,一定要有一个负数,但是这样的话忽略了3个0的情况,因此没有全部通过,而且如果负数正数这么搜索的话,一正一负拿完,如果有重复数字需要重复利用,会导致输出的三元组存在重复的情况,因此需要去重,这个思路的代码是思路1代码。正常的思路应该是先把数组升序排列,用一个指针遍历数组,再在遍历的时候用双指针从两头向中间逼近,筛出剩余数据。不同的三元组是 [-1,0,1] 和 [-1,-1,2]。注意,输出的顺序和三元组的顺序并不重要。

qq_35085273的博客 1494

LeeCode15.三数之和C++实现

两数之和 三数之和【基础算法精讲 01】答案中不可以包含重复的三元组。,判断是否存在三元组。

hetupyou的博客 394

leecode 15. 三数之和

15. 三数之和 本题用排序+双指针比较容易理解解决,先进行排序,然后for遍历数组,在遍历过程中使用左右指针对一些细节判断。下面的答案提交后效率不高,可能是用来HashSet的原因,时间复杂度更高了。 class Solution { public List<List<Integer>> threeSum(int[] nums) { Arrays.sort(nums); List<List<Integer

maocaicai的博客 744

LeeCode15三数之和(Java)(双指针)

题目链接:LeeCode15三数之和 题目描述: 双指针问题,先排序,对于每一个数据将指针定在左边和右边,根据返回结果的跟零对比的大小判断将右指针左移(结果变小)还是将左指针右移(结果变大),每次找到答案集的时候将指针向中间靠拢(排除重复结果),找有没有别的解可以满足要求 class Solution { public List<List<Integer>> threeSum(int[] nums) { Arrays.sort(nums); L

weixin_43590593的博客 215

Leecode刷题笔记——15. 三数之和

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

Tyxxxxxx 284

leecode15题三数之和

虽然,这样的写法最后没有通过测试,但是可以一起复习组合问题和全排列问题,同时能意识到组合问题和排列问题,只能通过回溯法求解,正如卡哥说的:“因为没得选,一些问题能暴力搜出来就不错了,撑死了再剪枝一下,还没有更高效的解法。但写出来发现,这是要选用三个数,因此得用三层for循环,时间复杂度会变得十分高,如果是面试现场,我想面试官不会想看到这样的答案。之前一直搞不懂,现在可以这样理解:递归就是“递”和“归”,在递的时候其实就是+i,返回这个函数调用点的时候就是回溯“归”了。灵神的讲的不错,还没有悟透,先水水。

m0_58321258的博客 541

Leecode-15 三数之和

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

Kingsley's Blog 220

Leecode 15.题:三数之和

Leecode 15.题:三数之和

StackOverFLow 421

LeeCode数组第15题三数之和

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

weixin_30535167的博客 162
上一篇: 59. 螺旋矩阵 II
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhao_programmer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值