LeetCode第15题三数之和

简介: 该文章介绍了 LeetCode 第 15 题三数之和的解法,通过先对数组排序,使用双指针减少循环层数,依次取一个元素作为第一个元素,通过双指针法寻找符合条件的三元组,并进行去重处理,同时总结了 2 数之和可使用哈希表解决,超过 2 数之和可使用双指针减少循环次数。

继续打卡算法题,今天学习的是LeetCode的第15题三数之和,这道题目是道中等题。算法题的一些解题思路和技巧真的非常巧妙,每天看一看算法题和解题思路,我相信对我们的编码思维和编码能力有一些帮助。

image.png

分析一波题目

这个题目,我们可以先把数组从小到大排序,这样可以方便对相同的数去重。 死办法是需要3层循环,但是我们如果想到使用双指针就可以减少到2层循环,记得双指针可以用于减少循环层数

只有2层循环了,我们依次取一个元素作为第一个元素,通过双指针法,第二个元素从第一元素后1个元素开始取,第三个元素从最后一个元素开始找符合条件的三元组,直到第二个元素指针>=第三个元素指针。

比如

[1,0,1,2,-1], 排序后变成,[-1,0,1,1,2]

第一遍

第一个元素是-1

第2个元素 依次找 0

第3个元素 依次找 2,这个时候-1+0+2>0,所以继续找1,此时-1+0+1满足=0,记录下来。接着看1和上一个1重复了,去重,这个时候起始下标已经重合,因此以-1开始的三元组查找就结束了。

接着在找第2个,第3个开始的三元组。

编码实现

class Solution {
   
   
    //思路 定义一个固定节点 两个起始节点 移动起始节点确定有没有等于0的情况
    public List<List<Integer>> threeSum(int[] nums) {
   
   

        int size = nums.length;
        Arrays.sort(nums);
        List<List<Integer>> result = new ArrayList<>();
        for(int i =0; i<size; i++) {
   
   

            int start = i+1;
            int end = size-1;

            if(nums[i] >0) {
   
   
                return result;
            }
            //去重
            if(i>0 && nums[i] == nums[i-1]) {
   
   
                continue;
            }

            while(start < end) {
   
   

                int r = (nums[start] + nums[end] + nums[i]);
                if(r == 0) {
   
   
                    //找到了符合和等于0的,记录下来
                    List<Integer> subResult = new ArrayList<>();
                    subResult.add(nums[i]);
                    subResult.add(nums[start]);
                    subResult.add(nums[end]);
                    result.add(subResult);
                    //去重复
                    while( start< end && nums[start] == nums[start+1]) {
   
   
                        start = start +1;    
                    }
                    //去除重复
                    while( start < end && nums[end] == nums[end-1]) {
   
   
                        end = end-1;    
                    }
                    start++;
                    end--;
                    continue;
                } 
                 //和大于0,右边的数太大,因此右边的索引要往左移
                if( r > 0) {
   
   
                    end--;
                    continue;
                }
                 //和小于0,左边的数太小,因此左边的索引往右移
                if(r < 0) {
   
   
                   start++;
                }
            }

        }
        return result;

    }

}

总结

2数之和我们可以想到使用hash表解决,超过2数之和的情况循环次数就多了,双指针可以用来减少循环次数。

相关文章
|
存储 程序员 编译器
|
测试技术
你真的知道什么是冒烟测试吗?
大家好,我是阿萨。日常工作中,经常都会提到冒烟测试。那么什么是冒烟测试呢?
4192 0
你真的知道什么是冒烟测试吗?
|
安全 测试技术
测试团队的一次复盘实践
测试团队的一次复盘实践
649 0
|
6月前
|
人工智能 自然语言处理 机器人
教学场景机器人关键技术解析与主流产品选型指南
随着AI技术深入教育,教学机器人正从展示工具进化为集辅导、减负、管理于一体的“认知伙伴”。依托NLP、CV、SLAM等技术,结合神经符号引擎、多模态情感计算与联邦学习,实现精准教学与隐私保护。猎户星空、优必选、科大讯飞、大疆等企业各具优势,推动教育智能化迈向新阶段。(238字)
428 6
|
4月前
|
机器学习/深度学习 人工智能 自然语言处理
大模型强化学习扫盲:PPO、GRPO、DPO,哪个才是你的“AI教练”?
本文深入浅出解析大模型强化学习三大主流技术:PPO(严苛精英培养)、GRPO(群体赛马激发思维链)、DPO(极简偏好对齐)。厘清其核心思想、适用场景与选型逻辑,助你15分钟掌握如何用RL真正提升模型“思考力”而非仅拟合答案。(239字)
|
存储 算法
Leetcode第三题(无重复字符的最长子串)
这篇文章介绍了解决LeetCode第三题“无重复字符的最长子串”的算法,使用滑动窗口技术来找出给定字符串中最长的不含重复字符的子串,并提供了详细的代码实现和解释。
777 0
Leetcode第三题(无重复字符的最长子串)
|
机器学习/深度学习 人工智能 自然语言处理
《深度剖析架构蒸馏与逻辑蒸馏:探寻知识迁移的差异化路径》
架构蒸馏与逻辑蒸馏是知识蒸馏的两大核心技术,分别聚焦于模型结构和决策逻辑的优化。架构蒸馏通过模仿大型模型的拓扑结构,提升小型模型的性能与效率;逻辑蒸馏则提炼大型模型的推理路径,增强小型模型的智能决策能力。二者在实现方式、作用机理和应用场景上各有侧重,可互补应用于资源受限环境下的高效模型部署与复杂任务处理,共同推动人工智能的发展。
394 23
|
NoSQL Java 应用服务中间件
大厂面试必备:如何轻松实现分布式Session管理?
这篇文章介绍三种分布式Session的实现方案:基于JWT的Token、基于Tomcat的Redis和基于Spring的Redis。JWT方案通过生成Token存储用户信息,实现无状态、可扩展的会话管理,但可能增加请求负载且数据安全性较低。Tomcat与Redis结合,通过配置Tomcat和Redis,实现Session集中管理和高性能存储,但配置相对复杂。Spring整合Redis适用于SpringBoot和SpringCloud项目,集成方便,扩展性强,但同样依赖外部Redis服务。每种方法有其优缺点,适用场景不同。作者小米是一个技术爱好者,欢迎关注其微信公众号“软件求生”获取更多技术内容
1074 4
|
前端开发
MVVM框架原理
MVVM框架(Model-View-ViewModel)是一种基于数据绑定的前端架构模式。它将视图逻辑与业务逻辑分离,提供了一种简单而清晰的方式来管理和组织代码。
1195 0