leetcode 15. 三数之和(优质解法)

news2024/11/18 9:37:32

代码:

class Solution {
    public static List<List<Integer>> threeSum(int[] nums) {
        Arrays.sort(nums);
        List<List<Integer>> lists=new ArrayList<>();
        int length=nums.length;
        for(int i=0;i<=length-3;){
            int left=i+1;
            int right=length-1;

            while (left<right){
                if(nums[left]+nums[right]>-nums[i]){
                    right--;
                }else if(nums[left]+nums[right]<-nums[i]){
                    left++;
                }else {
                    //满足条件,将数据保存到二维列表中
                    lists.add(new ArrayList<>(Arrays.asList(nums[i],nums[left],nums[right])));
                    //继续移动寻找下一组数据
                    left++;
                    right--;
                    while (left<right&&nums[left]==nums[left-1]){
                        left++;
                    }
                    while (left<right&&nums[right]==nums[right+1]){
                        right--;
                    }
                }
            }

            i++;
            while (i<=length-3&&nums[i]==nums[i-1]){
                i++;
            }
        }

        return lists;
    }
}

题解:

        我们要在数组中选出相加为 0 的三个数,要选出符合条件的多个数,我们可以尝试采用先排序,利用有序数组的单调性和双指针的方式解决,推荐先看leetcode LCR 179. 查找总价格为目标值的两个商品(优质解法)

        首先对于示例 ,-2.-1,-1,2,4,1,1,1,1,经过排序以后得到 -2.-1,-1,1,1,1.,2,4,1由于此时我们要获取 3 个数,而采用双指针的方式只能探讨两个数的选择,所以我们可以先固定一个数,先用指针 i 指向要固定的数 -1,此时我们只需要在 i 右边的区间内找到两个数,使 nums[ L ] + nums[ R ]= — nums[ i ] 即可

        如下图,让指针 L 指向右边区间中最小的数,R 指向右边区间中最大的数,此时 -1+4= 3 > 2,此时得到的数据较大,而 L 指针已经指向了区间中最小的数,所以就要淘汰大的数 4 ,指针 R- - 

-2        -1        -1        1        1        1        1         2        4

 i           L                                                            R

        当 R- -  以后 -1 +2 = 1 <  2 此时得到的数据较小,而 R 指针已经指向了区间中最大的数,所以就要淘汰小的数 -1 ,指针 L ++

-2        -1        -1        1        1        1        1.        2        4

 i           L                                                  R

        当指针  L ++ 以后,-1 + 1 = 0 < 2 此时得到的数据较小,而 R 指针已经指向了区间中最大的数,所以就要淘汰小的数 -1 ,指针 L ++

-2        -1        -1        1        1        1        1.        2        4

 i                      L                                       R

          当指针  L ++ 以后,1+1=2=2 ,此时 nums[ i ],nums[ L ],nums[ R ]就是一组满足条件的三元组,将该 三元组保存到二维列表中,由于我们要找出所有的情况,所以此时还不能返回,要继续寻找

-2        -1        -1        1        1        1        1.        2        4

 i                                 L                            R

        让 L++,R- -,此时 L 指向的是 1 和之前一样,由于题目要求不能有重复数据,此时即使 L 指针指向的数据和 R 指针指向的数据满足要求,也是重复的,不需要的数据,所以当 nums[ L ]=nums[ L -1 ] 时,就直接跳过,L++,R 指针也是一样的道理,当 nums[ R ]=nums[ R +1 ] 时,就直接跳过, R- -,这样就能保证我们得到的结果不重复

-2        -1        -1        1        1        1        1.        2        4

 i                                           L       R

        在处理数据重复方面,我们还需要注意一个情况,如图当 i 指针指向 -1 时,就代表要在右边的集合中寻找两个数,两个数相加的和为 1,而 i-1 下标指向的值也是 -1 ,就代表之前已经在右边的区间寻找了相加和为 1 的两个数了,此时再寻找也只会找到同样的数,就会导致数据重复,所以当 nums[ i ]=nums[ i - 1 ] 时 ,就直接跳过,i++,这样就能保证我们得到的结果不重复

-2        -1        -1        1        1        1        1.        2        4

            i-1        i     

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

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

相关文章

springboot基础配置及maven运行

目录 1、spring快速开始&#xff1a; 2、通过idea工具打开导入包 3、maven打包 1、springboot快速开始&#xff1a; 环境依赖&#xff1a;jdk17 Spring | Quickstart spring初始化包下载&#xff1a; 点击generate&#xff0c;下载包 2、通过idea工具打开导入包 我之前写了…

RK3568 android 13 内置 google GMS服务

需求&#xff1a;Android 系统在国外使用安装app很多需要gms服务&#xff0c;否则无法正常使用&#xff0c;所以出厂前必须要把GMS包集成进系统 1.下载gms包https://download.csdn.net/download/qq_46524402/88136401 2.解压gms包 并放到Android SDK根目录的vender文件夹下 3…

内网渗透隧道技术一netsh

隧道技术 百度百科&#xff1a; 网络隧道技术指的是利用一种网络协议来传输另一种网络协议&#xff0c;它主要利用网络隧道协议来实现这种功能。网络隧道技术涉及了三种网络协议&#xff0c;即网络隧道协议、隧道协议下面的承载协议和隧道协议所承载的被承载协议 在网络安全中…

通往数百万量子比特的商业化之路——

在已知物理定律的限制下&#xff0c;我们能制造出的最好的计算机是什么&#xff1f;争夺这一头衔的是通用、容错和可扩展的量子计算机。 这台建立在量子理论基础上的机器能够运行任何量子算法&#xff0c;检测并纠正任何可能危及计算的错误&#xff0c;并容纳大量量子比特。 当…

开发电脑软件学什么语言?哪些语言最适合?

随着信息技术的不断发展&#xff0c;电脑软件已经成为人们日常生活和工作中不可或缺的一部分&#xff0c;许多人都希望学习如何开发电脑软件&#xff0c;而选择一种合适的编程语言是成功的关键&#xff0c;下面将介绍几种最适合开发电脑软件的编程语言&#xff0c;以及一些基础…

自动提交日志脚本(2)状态机管理

使用状态机作为管理 """ filename:statusHandle.py author:LinXingNan time:2023-11-27 """ import os from enum import Enumimport configHandle import emailReport import logHandle import timeHandle import logging from datetime impo…

flask中路由route根据字典ID展示部分内容,字典名展示全部内容

from flask import Flask, jsonify , request,render_template,app Flask(__name__)app.config[JSON_AS_ASCII] Falsebooks [{"id": 1, "name": 三国演义},{"id": 2, "name": 水浒传},{"id": 3, "name": 西游记…

【UE】热成像效果

效果 步骤 1. 新建一个空白项目&#xff0c;勾选“光线追踪”选项 2. 添加一个第一人称游戏内容包到项目 3. 打开第一人称角色蓝图“BP_FirstPersonCharacter”&#xff0c;添加一个后期处理组件 在事件图表中设置通过按键N来切换不同的后期处理效果 将后期处理设置引脚提升为…

后端Long型数据传到前端js后精度丢失的问题

假设一个场景&#xff0c;MybatisPlus的雪花算法生成long类型主键ID&#xff0c;存入数据库&#xff0c;前端获取到数据后&#xff0c;要执行一个更新操作&#xff08;updateById&#xff09;&#xff0c;但这时会出现无法成功更新的情况&#xff01;这是因为前端在长度大于17位…

TCP/IP封装

数据如何通过网络发送&#xff1f;为什么 OSI 模型需要这么多层&#xff1f; 下图显示了数据在网络传输时如何封装和解封装。 步骤1&#xff1a;当设备A通过HTTP协议通过网络向设备B发送数据时&#xff0c;首先在应用层添加HTTP头。 步骤2&#xff1a;然后将TCP或UDP标头添加…

Python数据清洗--运用3δ准则检测异常值

1.3δ准则检测异常值的基本原理 当数据为连续型变量、服从或近似服从正态分布时&#xff0c;可运用3δ准则检测异常值。在该准则条件下&#xff0c;数据值与均值的偏差如果超过标准差的3倍&#xff0c;那么该数据值就会被视为异常值。即针对样本xi&#xff0c;如果满足&#x…

【Linux--进程】

目录 一、基本概念1.1描述进程-PCB1.2task_struct中内容分类 二、了解进程2.1查看进程2.2通过系统调用获取进程标识符 三、fork创建进程3.1fork()函数3.2写时拷贝 四、进程的状态4.1操作系统学科里的进程状态&#xff08;运行、阻塞、挂起&#xff09;4.具体的Linux状态是如何维…

MySQL之undo日志

聊聊undo log 什么是undo log undo log&#xff08;回滚事务&#xff09;&#xff0c;在事务没有提交前&#xff0c;MySQL将记录更新操作的反向操作到undo log日志中&#xff0c;以便进行回退保证事务的原子性 undo log的作用 1.提供回滚操作 我们在进行数据更新操作的时候…

【Android Jetpack】Lifecycle 感知生命周期

文章目录 背景示例LifeCycle的原理LifecycleOwner自定义LifecycleOwnerLifecycleObserver 示例改进使用LifecycleService解耦Service与组件整个应用进程的生命周期ProcessLifecycleOwner 背景 在Android应用程序开发中&#xff0c;解耦很大程度上表现为系统组件的生命周期与普…

C++学习之路(十三)C++ 用Qt5实现一个工具箱(增加一个Base64加解密功能)- 示例代码拆分讲解

上篇文章&#xff0c;我们用 Qt5 实现了在小工具箱中添加了《XML文本格式化功能》功能。为了继续丰富我们的工具箱&#xff0c;今天我们就再增加一个平时经常用到的功能吧&#xff0c;就是「 Base64加解密 」功能。下面我们就来看看如何来规划开发一个这样的小功能并且添加到我…

改造http.server为简单的文件下载服务

改造 修改http.server.SimpleHTTPRequestHandler&#xff0c;实现简单的文件上传下载服务 simple_http_file_server.py&#xff1a; # !/usr/bin/env python3import datetime import email import html import http.server import io import mimetypes import os import posi…

hql面试题之字符串使用split分割,并选择其中的一部分字段的问题

版本&#xff1a;20231109 1.题目&#xff1a; 有两张表,a表有id和abstringr两个字段&#xff0c;b表也有id和bstr两个字段&#xff0c;具体如下 A表&#xff1a; 1abc,bcd,cdf2123,456,789 B表: 1acddef2123456 在a表的abstring字段中用‘,’分割&#xff0c;并取出前两…

万宾科技水环境综合治理监测系统的融合与应用

随着社会经济的快速发展&#xff0c;我国的水环境污染问题日益凸显&#xff0c;这不仅对生态环境造成了严重破坏&#xff0c;也严重威胁到人民群众的健康和生活质量。为了解决这一问题&#xff0c;城市生命线与水环境综合治理监测系统应运而生&#xff0c;二者的结合将为水环境…

TA-Lib学习研究笔记——Overlap Studies(二)下

TA-Lib学习研究笔记——Overlap Studies&#xff08;二&#xff09;下 &#xff08;11&#xff09;SAR - Parabolic SAR 抛物线指标 函数名&#xff1a;SAR 名称&#xff1a; 抛物线指标 简介&#xff1a;抛物线转向也称停损点转向&#xff0c;是利用抛物线方式&#xff0c;随…

在Springboot中将数据渲染到前端页面1.0

前端数据代码&#xff1a; <?xml version"1.0" encoding"UTF-8" ?> <emps><emp><name>金毛狮王</name><age>55</age><image>https://web-framework.oss-cn-hangzhou.aliyuncs.com/web/1.jpg</image…