【LeetCode热题100】--15.三数之和

news2024/11/24 4:53:59

15.三数之和

image-20230918103833462

注意:最后答案中不能包含重复的三元组

使用排序+双指针

可以使用三重循环枚举三元组,但是需要哈希表进行去重操作,得到不包含重复三元组的最终答案,消耗量大量的时间和空间

对于不重复的本质,保持三重循环的大框架不变,只需要保证:

  • 第二重循环枚举到的元素不小于当前第一重循环枚举到的元素
  • 第三重循环枚举到的元素不小于当前第二重循环枚举到的元素

也就是说,我们枚举到的三元组(a,b,c)满足a≤b≤c,保证了只有(a,b,c)这个顺序会被枚举到,而(b,a,c)和(c,b,a)这些不会,这样就减少了重复,要实现这一点,可以将数组中的元素从小到大进行排序

同时,保证在每一重循环中,相邻两次枚举的元素不相同,避免重复

此时,时间复杂度仍未 O ( N 3 ) O(N^3) O(N3),仍然没有跳出三重循环的大框架,因此继续优化,进一步,如果我们固定了前两重循环枚举到的元素a和b,那么只有唯一的c满足a+b+c=0,当第二重循环往后枚举一个元素b’时,由于b’>b,那么满足a+b’+c’=0的c’一定有c’<c,即c‘在数组中一定出现在c的左侧,也就是说,我们可以从小到大枚举b,同时从大到小枚举c,即第二重循环和第三重循环实际上是并列的关系,这就是双指针:当我们需要枚举数组中的两个元素时,如果我们发现随着第一个元素的递增,第二个元素是递减的,那么就可以使用双指针的方法,将枚举的时间复杂度从 O ( N 2 ) O(N^2) O(N2)减少至 O ( N ) O(N) O(N)

class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        int n = nums.length;
        Arrays.sort(nums);  //先对数组进行排序
        List<List<Integer>> ans = new ArrayList<List<Integer>>();
        //枚举a
        for(int first = 0;first < n; first++){
            //需要和上一次枚举的数不相同,只有和上一次枚举的元素不相同时,才会进行枚举
            if(first > 0 && nums[first] == nums[first - 1]){
                continue;
            }
            // c对应的指针指向数组的最右端
            int third = n - 1;
            int target = -nums[first];
            // 枚举b
            for(int second = first + 1;second<n;second++){
                //同样需要和上一次枚举的元素不相同
                if(second > first + 1 && nums[second] == nums[second -1]){
                    continue;
                }
                //保证b的指针在c的指针的左侧
                while(second < third && nums[second] + nums[third] > target){
                    --third;
                }
                //如果指针重合,随着b后续的增加
                // 就不会有满足a+b+c=0并且b<c了,可以退出循环
                if(second == third){
                    break;
                }
                if(nums[second] + nums[third] == target){
                    List<Integer> list = new ArrayList<Integer>();
                    list.add(nums[first]);
                    list.add(nums[second]);
                    list.add(nums[third]);
                    ans.add(list);
                }
            }

        }
        return ans;
    }

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1021946.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux学习笔记】 - 常用指令学习及其验证(下)

前言&#xff1a;本文延续上一篇文章【Linux学习笔记】 - 常用指令学习及其验证&#xff08;上&#xff09;对常用的指令进行介绍和验证。 一、mv指令 &#xff08;1&#xff09;功能&#xff1a;用来移动文件或者将文件改名 &#xff08;2&#xff09;语法及验证&#xff1a…

【QT--使用百度地图API显示地图并绘制路线】

QT--使用百度地图API显示地图并绘制路线 前言准备工作申请百度地图密钥(AK)安装开发环境 开发过程新建项目ui界面GPSManager类主窗口Map 效果展示 前言 先吐槽一下下&#xff0c;本身qt学的就不咋滴&#xff0c;谁想到第一件事就是让写一个上位机工具&#xff0c;根据CAN总线传…

OJ练习第177题——打家劫舍 IV(二分查找)

打家劫舍 IV 力扣链接&#xff1a;2560. 打家劫舍 IV 题目描述 沿街有一排连续的房屋。每间房屋内都藏有一定的现金。现在有一位小偷计划从这些房屋中窃取现金。 由于相邻的房屋装有相互连通的防盗系统&#xff0c;所以小偷 不会窃取相邻的房屋 。 小偷的 窃取能力 定义为…

人脸修复祛马赛克算法CodeFormer——C++与Python模型部署

一、人脸修复算法 1.算法简介 CodeFormer是一种基于AI技术深度学习的人脸复原模型&#xff0c;由南洋理工大学和商汤科技联合研究中心联合开发&#xff0c;它能够接收模糊或马赛克图像作为输入&#xff0c;并生成更清晰的原始图像。算法源码地址&#xff1a;https://github.c…

同步 -- 互斥锁

本篇文章基于Linux-6.5源码 建议&#xff1a;搭配Linux源码观看更佳 struct mutex {atomic_long_t owner;spinlock_t wait_lock; //自旋锁&#xff0c;该自旋锁的作用是保护后面的等待队列的原子性struct list_head wait_list; //等待队列 }; API接口 mutex_init 互斥锁初…

C语言入门Day_22 初识指针

目录 前言&#xff1a; 1.内存地址 2.指针的定义 3.指针的使用 4.易错点 5.思维导图 前言&#xff1a; 之前我们学过变量可以用来存储数据&#xff0c;就像一个盒子里面可以放不同的球一样。 这是一个方便大家理解专业概念的比喻。 在计算机世界里面&#xff0c;数据实…

海外ASO优化之提高应用曝光度的技巧1

作为应用程序的开发者&#xff0c;如何使我们的应用在众多竞争对手中脱颖而出&#xff1f;如何应用在App Store搜索中排名更高&#xff0c;以确保它符合App Store搜索中的搜索意图&#xff1f;这些都是我们要重点考虑的。 1、做好应用程序描述。 在填写应用描述之前&#xff0…

直线模组的常用语

在工业生产中&#xff0c;直线模组的叫法有很多种&#xff0c;对于新手小白来说&#xff0c;很容易就会被绕晕&#xff0c;今天我们就来简单说一下直线模组的常用称呼吧&#xff01; 1、直线模组&#xff1a;与直线滑台同义&#xff0c;基本可以相互互换。直线模组一般是指可以…

编译原理.龙书学习1

第一章&#xff1a; 编译器&#xff1a;将程序翻译成一种能够被计算机执行的形式 解释器&#xff1a;解释器直接利用用户提供的输入执行源程序中指定的操作 一个编译器的结构 编译器将源程序映射为语义上等价的目标程序&#xff0c;这个映射过程由两部分组成&#xff1a;分析…

ApiFox衔接前后端开发人员,提升沟通效率实践

1. 为什么不用Postman而要使用ApiFox 1.1. Postman的问题(不便) 多系统数据不互通 API设计者、前端开发、后端开发、测试人员大量重复工作。 效率低 可视化程度低、操作不友好。 无法团队协作 单机离线使用为主&#xff0c;成员之间无法实时同步数据&#xff0c;无法协作。 …

Unity实现简易太阳系

开发环境&#xff1a;Unity 2022.3.5f1c1 Visual Studio 2022 太阳系相关星体&#xff1a;太阳、八大行星、月球 模拟星系&#xff1a;太阳系、地月系 功能&#xff1a;支持行星以太阳为中心&#xff0c;任意轴进行公转&#xff0c;此处演示同一平面。 a1-a8为公转轴&#xff…

需要每日温习的java八股文基础

一、java &#xff08;1&#xff09;集合 1.list&#xff1a;LinkedList、ArrayList和Vector ArrayList、LinkedList和Vector的区别&#xff0c;场景和扩容机制源码 LinkedList 接口实现类&#xff0c; 链表&#xff0c; 插入删除&#xff0c; 没有同步&#xff0c; 线程不…

网站降权的康复办法(详解百度SEO数据分析)

随着搜索引擎算法的不断升级&#xff0c;很多网站在SEO优化过程中遭遇到降权的情况。如果您的网站也遭遇到了类似的问题&#xff0c;不必惊慌失措。本文将为您详细介绍网站降权恢复的方法&#xff0c;包括百度SEO数据分析、网站收录少的5个原因、网站被降权的6个因素以及百度SE…

什么是顶点颜色

在3D模型的渲染中&#xff0c;除了贴图属性外&#xff0c;顶点颜色也是一种常见的材质属性。顶点颜色是指通过给模型的顶点分配颜色值来定义模型表面的颜色。 顶点颜色通常以顶点数据的形式储存&#xff0c;并且与每个顶点的位置信息相对应。在渲染过程中&#xff0c;顶点颜色会…

【性能测试】JMeter:集合点,同步定时器的应用实例!

一、集合点的定义 在性能测试过程中&#xff0c;为了真实模拟多个用户同时进行操作以度量服务器的处理能力&#xff0c;可以考虑同步虚拟用户以便恰好在同一时刻执行操作或发送请求。 通过插入集合点可以较真实模拟多个用户并发操作。 (注意&#xff1a;虽然通过加入集合点可…

pdf在线加密怎么做?几个好用的方法分享

PDF在线加密怎么做&#xff1f;在进行PDF在线加密时&#xff0c;您可以使用以下几种方法来确保文档的安全性&#xff0c;并注意以下一些加密的注意事项。 方法一&#xff1a;使用PDF转换加密工具 首先我们可以在电脑上打开迅捷PDF转换器工具&#xff0c;进入该转换工具后先在顶…

Vue系列(二)之 基础语法【上篇】

目录 一. 插值 1.1 文本 1.2 原始HTML 1.3 属性 1.4 表达式 二. 指令 2.1 v-if/v-else-if/v-else指令 2.2 v-show指令 2.3 v-for指令 2.4 下拉框/复选框 2.5 动态参数 三. 过滤器 3.1 局部过滤器基本应用 3.2 局部过滤器串行使用 3.3 局部过滤器传参 3.4 全局过…

无涯教程-JavaScript - LCM函数

描述 LCM函数返回整数的最小公倍数。最小公倍数是最小的正整数,它是所有整数参数number1,number2等的倍数。使用LCM添加具有不同分母的分数。 语法 LCM (number1, [number2] ...)争论 Argument描述Required/OptionalNumber1, number2... 您想要最小公倍数的1到255个值。 如…

【JDK 8-函数式编程】4.2 BiFunction

一、BiFunction 二、改造上节课&#xff1a;四则运算 一、BiFunction Function 只能接收一个参数&#xff0c;要传递两个参数,则用 BiFunction 两个参数&#xff1a;可以是两种不同数据类型 调用方法: R apply(T t, U u); import java.util.Objects;/*** param <T>…

无涯教程-JavaScript - GCD函数

描述 GCD函数返回两个或多个整数的最大公约数。最大公约数是将number1和number2均除而无余数的最大整数。 语法 GCD (number1, [number2] ...)争论 Argument描述Required/OptionalNumber11 to 255 values. If any value is not an integer, it is truncated.Requirednumber…