leetcode 18. 四数之和(优质解法)

news2024/10/7 14:32:00

代码:

class Solution {
    public List<List<Integer>> fourSum(int[] nums, int target) {
        List<List<Integer>> lists=new ArrayList<>();

        int length=nums.length;
        Arrays.sort(nums);

        for(int i=0;i<=length-4;){
            for(int j=i+1;j<=length-3;){
                //先固定两个数,再采用双指针和利用有序数组单调性来找到符合条件的另外两个数
                //加减操作很可能会溢出,所以最好用 long 类型
                long LRTarget=(long) target-nums[i]-nums[j];

                int left=j+1;
                int right=length-1;
                while (left<right){
                    long newLR=nums[left]+nums[right];
                    if(newLR<LRTarget){
                        left++;
                    }else if(newLR>LRTarget){
                        right--;
                    }else {
                        //符合条件,记录当前的 nums[i],nums[j],nums[left],nums[right]
                        lists.add(Arrays.asList(nums[i],nums[j],nums[left],nums[right]));
                        left++;
                        right--;
                        //去重操作
                        //一般在容器中进行死循环移动都要考虑边界问题
                        while (left<right&&nums[left]==nums[left-1]){
                            left++;
                        }
                        while (left<right&&nums[right]==nums[right+1]){
                            right--;
                        }
                    }
                }
                //当前固定的 num[j] 的所有情况都找到了
                j++;
                while (j<=length-3&&nums[j]==nums[j-1]){
                    j++;
                }
            }

            //当前固定的 num[i] 的所有情况都找到了
            i++;
            while (i<=length-4&&nums[i]==nums[i-1]){
                i++;
            }
        }

        return lists;
    }
}

题解:

        我们要在数组中选出相加为 0 的三个数,要选出符合条件的多个数,我们可以尝试采用先排序,利用有序数组的单调性和双指针的方式解决

        四数之和的求解方法和三数之和几乎一样,只是多了一个固定的数而已,推荐先看leetcode 15. 三数之和(优质解法)

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

        如下图,让指针 L 指向右边区间最小的数,指针 R 指向右边区间最大的数,此时 nums[ L ] + nums[ R ] = -1+5 = 4 > 3, 就需要取的两数之和小一点,此时 L 指针已经是区间中最小的了,所以需要淘汰大的数 5, R - -

-1        -1        -1        0        0        3        3        5

 i           j          L                                                R

        此时 nums[ L ] + nums[ R ] = -1+3=2 < 3 ,就需要取的两数之和大一点,此时 R 指针已经是区间中最大的了,所以需要淘汰小的数 -1,L++

-1        -1        -1        0        0        3        3        5

 i           j          L                                      R

         此时 nums[ L ] + nums[ R ] = 0+3=3 == 3,符合条件,就记录当前 nums[ i ] , nums[ j ] ,nums[ L ] ,nums[ R ] 的值,由于需要找出所有的情况,所以现在还不能停止,让 L++,R- -,继续寻找符合条件的数据

-1        -1        -1        0        0        3        3        5

 i           j                    L                            R

        题目中有要求,要去除重复的数据,当我们排序以后相同的数据都会靠在一起,我们上一轮已经将 nums[ L ] 为 0 的值获取了,此时 nums[ L ] 依然为 0,即使有符合条件的 nums[ R ] 也是重复的要排除掉,所以当 nums[ L ] == nums[ L-1 ] 时,就直接 L ++ 跳过(在跳过时要注意边界问题),对于 R 指针也是一样的处理,当 nums[ R ] == nums[ R+1 ] 时,就直接 R- - 跳过

-1        -1        -1        0        0        3        3        5

 i           j                              L        R        

        当 L == R 时就说明当前固定的 nums[ j ] 的情况已经全部发现了,就需要 j++,但其中也涉及到数据重复的问题,j ++ 以后指向的值依然为 -1 ,代表要在右边的区间寻找两个和为 3 的数,但之前已经寻找过了,现在再找一遍也只会找到同样的数据,所以当 nums[ j ] == nums[ j+1 ] 时就直接 j++ 跳过,对于下标 i 也一样,当nums[ i ] == nums[ i+1 ] 时就直接 i++ 跳过

-1        -1        -1        0        0        3        3        5

 i                      j                            R        

                                                      L         

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

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

相关文章

Oracle--索引

文章目录 一、索引是什么?二、索引的原理三、索引的特征四、创建索引的方式五、怎么确认索引六、案列七、复合索引 一、索引是什么? 索引&#xff08;INDEX&#xff09;是数据库中用于提高查询效率的一种数据结构。它可以加速数据库表的数据查找、过滤和排序等操作。索引是一…

hive创建ES外部表过程中的问题

一、缺少jar包&#xff1a;httpclient 报错&#xff1a; “HiveServer2-Handler-Pool: Thread-696” java.lang.NoClassDefFoundError: org/apache/commons/httpclient/protocol/ProtocolSocketFactory 需要加载commons-httpclient-3.1.jar 二、缺少jar包&#xff1a;eshado…

功率信号源简介及其应用有哪些内容

功率信号源是一种能够提供稳定输出功率信号的设备或电路。它在许多领域中都有广泛的应用。以下是一些关于功率信号源的内容&#xff1a; 功率信号源简介&#xff1a;功率信号源是一种电子设备或电路&#xff0c;它能够提供稳定的输出功率信号。功率信号源通常由放大器、稳压器、…

MATLAB中imbothat函数用法

目录 语法 说明 示例 使用底帽和顶帽滤波增强对比度 imbothat函数的功能是对图像进行底帽滤波。 语法 J imbothat(I,SE) J imbothat(I,nhood) 说明 J imbothat(I,SE) 使用结构元素 SE 对灰度或二值图像 I 执行形态学底帽滤波。底帽滤波计算图像的形态学闭运算&#…

Linux--2.6内核调度和环境变量

&#x1f4d8;北尘_&#xff1a;个人主页 &#x1f30e;个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上&#xff0c;不忘来时的初心 文章目录 一、Linxu2.6内核进程调度队列1、一个CPU拥有一个runqueue2、优先级3、优先级活动队列4、过期…

用纯 CSS 实现网格背景

是不是在日常开发中经常遇到实现网格的需求&#xff0c;网格通常对网页中展示的元素能起到很好的定位和对齐作用。 这里介绍如何只通过 CSS 来实现这个需求&#xff1f; 使用背景图 这里我们的背景图使用 SVG 来创建&#xff0c;首先&#xff0c;创建绘出一个正方形&#xff0c…

学会XPath,轻松抓取网页数据

一、定义 XPath&#xff08;XML Path Language&#xff09;是一种用于在 XML 文档中定位和选择节点的语言。XPath的选择功能非常强大&#xff0c;可以通过简单的路径选择语法&#xff0c;选取文档中的任意节点或节点集。学会XPath&#xff0c;可以轻松抓取网页数据&#xff0c…

机器人仿真之Vrep中Graph功能下的各种曲线问题汇总

vrep&#xff0c;机器人仿真软件大佬&#xff0c;在仿真机械臂轨迹时涉及到末端轨迹的曲线等一系列问题&#xff0c;在不与matlab联合仿真的情况下如何使用vrep获得各种曲线&#xff1f;如何调取Graph表格功能中的各种曲线标题&#xff1f;

系统清理软件CCleaner pro mac功能亮点

CCleaner pro for mac是一款mac系统清理软件。CCleaner pro 主要用来清除mac系统不再使用的垃圾文件&#xff0c;以腾出更多硬盘空间。CCleaner pro下载的另一大功能是清除使用者的上网记录。CCleaner的体积小&#xff0c;运行速度极快&#xff0c;可以对临时文件夹、历史记录、…

three.js--立方体

作者&#xff1a;baekpcyyy&#x1f41f; 使用three.js渲染出可以调节大小的立方体 1.搭建开发环境 1.首先新建文件夹用vsc打开项目终端 2.执行npm init -y 创建配置文件夹 3.执行npm i three0.152 安装three.js依赖 4.执行npm I vite -D 安装 Vite 作为开发依赖 5.根…

IDEA专栏—重装IDEA的配置

文章目录 1、maven路径2、默认文件路径3、插件4、导包顺序5、快捷键6、调整配置插件 1、maven路径 2、默认文件路径 3、插件 4、导包顺序 import static all other imports <blank line> import java.* import javax.* <blank line> import all other imports <…

智慧科研助力科研数据的分析处理

如今&#xff0c;科研领域的发展日新月异&#xff0c;数据量也越来越大。这时&#xff0c;智慧科研可视化技术不仅为科研人员提供了快速高效的数据分析手段&#xff0c;而且为科研工作的推进提供了新的思路和方法。通过可视化手段&#xff0c;我们可以将各种数据、信息、知识以…

TCP 连接断开

1&#xff1a;TCP 四次挥手过程是怎样的&#xff1f; 客户端打算关闭连接&#xff0c;此时会发送一个 TCP 首部 FIN 标志位被置为 1 的报文&#xff0c;也即 FIN 报文&#xff0c;之后客户端进入 FIN_WAIT_1 状态。 服务端收到该报文后&#xff0c;就向客户端发送 ACK 应答报文…

JavaEE进阶学习:Bean 作用域和生命周期

1.Bean 作用域 .通过一个案例来看 Bean 作用域的问题 假设现在有一个公共的 Bean&#xff0c;提供给 A 用户和 B 用户使用&#xff0c;然而在使用的途中 A 用户却“悄悄”地修改了公共 Bean 的数据&#xff0c;导致 B 用户在使用时发生了预期之外的逻辑错误。 我们预期的结果…

如何修改.exe文件的修改时间,亲测有效

&#x1f482; 个人网站:【 海拥】【神级代码资源网站】【办公神器】&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交流的小伙伴&#xff0c;请点击【全栈技术交流群】 演示视频&#xff1a; 10秒钟实现将文件的修改…

Achronix推出基于FPGA的加速自动语音识别解决方案

提供超低延迟和极低错误率&#xff08;WER&#xff09;的实时流式语音转文本解决方案&#xff0c;可同时运行超过1000个并发语音流 2023年11月——高性能FPGA芯片和嵌入式FPGA&#xff08;eFPGA IP&#xff09;领域的领先企业Achronix半导体公司日前自豪地宣布&#xff1a;正式…

曲面拼接oled屏幕为何受到企业展览青睐

曲面拼接OLED屏幕受到企业展览青睐的原因主要有以下几点&#xff1a; 创新的技术&#xff1a;曲面拼接OLED屏幕采用先进的OLED技术&#xff0c;具有自发光原理&#xff0c;可以实现真正的黑色和高对比度&#xff0c;呈现出生动的图像。其每个像素都能独立发光&#xff0c;没有背…

世微 低功耗 PFM DC-DC 升压芯片 AP8105 干电池手持设备驱动IC

概述 AP8105 系列产品是一种高效率、低纹波、工作频率高的 PFM 升压 DC-DC 变换器。AP8105 系列产品仅需要四个外围元器件&#xff0c;就可完成将低输入的电池电压变换升压到所需的工作电压&#xff0c;非常适合于便携式 1&#xff5e;4 节普通电池应用的场合。电路采用了高性能…

python实现获取aws route53域名信息

最近由于工作原因接触到aws的服务&#xff0c;我需要实时获取所有的域名信息&#xff0c;用于对其进行扫描&#xff0c;因此写了一个自动化爬取脚本 给需要的人分享。 1.基础准备 代码环境&#xff1a;python3 第三方库&#xff1a;boto3 &#xff08;安装方法pip install…

springboot+netty化身Udp服务端,go化身客户端模拟设备实现指令联动

&#x1f38f;&#xff1a;你只管努力&#xff0c;剩下的交给时间 &#x1f3e0; &#xff1a;小破站 springbootnetty化身Udp服务端&#xff0c;go化身客户端模拟设备实现指令联动 &#x1f517;涉及链接前言异步通信的优势异步通信的优势&#xff1a;异步通信的应用场景&…