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

代码:

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         

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【EasyExcel实践】万能导出,一个接口导出多张表以及任意字段(可指定字段顺序)

文章目录 前言正文一、POM依赖二、核心Java文件2.1 自定义表头注解 ExcelColumnTitle2.2 自定义标题头的映射接口2.3 自定义有序map存储表内数据2.4 表头工厂2.5 表flag和表头映射枚举2.6 测试用的实体2.6.1 NameAndFactoryDemo2.6.2 StudentDemo 2.7 启动类2.8 测试控制器 三、…

【Node.js】笔记整理 5 - Express框架

写在最前&#xff1a;跟着视频学习只是为了在新手期快速入门。想要学习全面、进阶的知识&#xff0c;需要格外注重实战和官方技术文档&#xff0c;文档建议作为手册使用 系列文章 【Node.js】笔记整理 1 - 基础知识【Node.js】笔记整理 2 - 常用模块【Node.js】笔记整理 3 - n…

阿里云崩溃了,为什么你没有收到补偿?【补偿领取方式放文末】

事情经过 北京时间11月27日&#xff0c;阿里云部分地域云数据库控制台访问出现异常。据悉&#xff0c;从当日09:16起&#xff0c;阿里云监控发现北京、上海、杭州、深圳、青岛、香港以及美东、美西地域的数据库产品(RDS、PolarDB、Redis等)的控制台和OpenAPI访问出现异常&…

从源代码出发,Jenkins 任务排队时间过长问题的解决过程

最近开发了一个部署相关的工具&#xff0c;使用 Jenkins 来构建应用。Jenkins 的任务从模板中创建而来。每次部署时&#xff0c;通过 Jenkins API 来触发构建任务。在线上运行时发现&#xff0c;通过 API 触发的 Jenkins 任务总是会时不时在队列中等待较长的时间。某些情况下的…

hash_hmac函数讲解

hash_hmac函数的概述 PHP中的hash_hmac函数是一种基于加密哈希算法的函数&#xff0c;用于计算消息的哈希值。它返回一个哈希值字符串&#xff0c;并且可以用于验证消息的完整性和认证。 哈希是一种将任意长度的消息映射到固定长度的值的算法。哈希函数可以将任意大小的数据转…

我若拿出这个,阁下该如何应对,整理常用的Python库!

Requests Requests是一个常用的Python第三方库&#xff0c;用于发送HTTP请求。它提供了简洁而直观的API&#xff0c;使得发送HTTP请求变得非常方便。 使用Requests库可以实现以下功能&#xff1a; 发送GET请求&#xff1a;使用requests.get(url, paramsNone, **kwargs)方法发…

Python基础语法之学习占位符

Python基础语法之学习占位符 一、代码二、效果 一、代码 name "张三" sex "男" age 10 money 12.5# 通过占位符完成拼接 print("姓名&#xff1a;%s" % name) print("姓名&#xff1a;%s,性别&#xff1a;%s" % (name, sex))text…

maven 常用命令解析

目录 maven 是什么 Maven 目录结构 maven 常用命令解析 mvn clean mvn validate mvn compile mvn test mvn package mvn verify mvn install mvn site mvn deploy maven 是什么 Maven 是一个流行的项目管理和构建工具&#xff0c;用于帮助开发人员管理 Java 项目的…

arcgis导出某个属性的栅格

选中栅格特定属性想要导出时&#xff0c;无法选中“所选图形” 【方法】spatial analyst 工具——提取分析——按属性提取

一套后台管理系统的入门级的增删改查(vue3组合式api+elemment-plus)

一、页面示意&#xff1a; 图一 图二 二、组件结构 列表组件 &#xff1a;index.vue,对应图一添加组件&#xff1a;add.vue&#xff0c;对应图二&#xff0c;用抽屉效果编辑组件&#xff1a;edit.vue&#xff0c;和添加组件的效果一个。 三、代码 1、列表组件: index.vue …

【程序员的自我修养02】初识ELF文件格式

绪论 大家好&#xff0c;欢迎来到【程序员的自我修养】专栏。正如其专栏名&#xff0c;本专栏主要分享学习《程序员的自我修养——链接、装载与库》的知识点以及结合自己的工作经验以及思考。编译原理相关知识本身就比较有难度&#xff0c;我会尽自己最大的努力&#xff0c;争取…

卷积的理解,卷积与通道的关系

神经网络中的卷积操作卷积在图像领域的功能单通道卷积多通道卷积&#xff08;1个卷积核&#xff09;多通道卷积&#xff08;多个卷积核&#xff09;总结扩展 图像处理中的卷积核恒等&#xff08;Identity&#xff09;边缘检测&#xff08;Edge detection&#xff09;锐化&#…

SAP ABAP ALV Tree 的使用

在 SAP 业务系统中&#xff0c;大量地使用到了ALV Tree 对象&#xff0c;该对象在表格基础上对同类数据 进行归类&#xff0c;并对各分类能进行数据汇总&#xff0c;如图8-10 所示。 以航班表&#xff08;SPFLI&#xff09;为例&#xff1a; &#xff08;1&#xff09;按国家…

主流数据库类型总结

前言&#xff1a;随着互联网的高速发展&#xff0c;为了满足不同的应用场景&#xff0c;数据库的种类越来越多容易混淆&#xff0c;所以有必要在此总结一下。数据库根据数据结构可分为关系型数据库和非关系型数据库。非关系型数据库中根据应用场景又可分为键值&#xff08;Key-…

深度学习之十二(图像翻译AI算法--UNIT(Unified Neural Translation))

概念 UNIT(Unified Neural Translation)是一种用于图像翻译的 AI 模型。它是一种基于生成对抗网络(GAN)的框架,用于将图像从一个域转换到另一个域。在图像翻译中,这意味着将一个风格或内容的图像转换为另一个风格或内容的图像,而不改变图像的内容或语义。 UNIT 的核心…

微服务--06--Sentinel 限流、熔断

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 1.微服务保护雪崩问题服务保护方案1.1.请求限流1.2.线程隔离1.3.服务熔断 2.Sentinel2.1.介绍和安装官方网站&#xff1a;[https://sentinelguard.io/zh-cn/](https…

Windows安装EMQX(搭建MQTT服务)

1、EMQX介绍 EMQ X是云原生分布式物联网接入平台。 EMQ X (Erlang/Enterprise/Elastic MQTT Broker) 是基于 Erlang/OTP 平台开发的开源物联网 MQTT 消息服务器。 Erlang/OTP是出色的软实时 (Soft-Realtime)、低延时 (Low-Latency)、分布式 (Distributed)的语言平台。 MQTT 是…

自学MySql(一)

1.安装下载 下载网址 2、将mysql的bin目录添加到环境变量&#xff08;可选&#xff09; 3、使用一下命令测试

最新消息:滴滴 P0 事故原因,原因出来了

最新消息滴滴P0故障原因&#xff0c;是由于k8s集群升级导致的&#xff0c;后面又进行版本回退&#xff0c;由于现在大型互联网公司基本都是基于K8s进行部署的&#xff0c;如果K8s集群一出问题&#xff0c;上面运行的业务Pod和运维系统全部都得宕机&#xff0c;导致没法回滚。 …

深入理解网络阻塞 I/O:BIO

&#x1f52d; 嗨&#xff0c;您好 &#x1f44b; 我是 vnjohn&#xff0c;在互联网企业担任 Java 开发&#xff0c;CSDN 优质创作者 &#x1f4d6; 推荐专栏&#xff1a;Spring、MySQL、Nacos、Java&#xff0c;后续其他专栏会持续优化更新迭代 &#x1f332;文章所在专栏&…