LeetCode 18. 四数之和 Java题解

server/2024/11/17 4:25:33/

这道题是扩展的三数之和。在三数之和中,我们固定a,利用双指针寻找b和c(两头分别开始找),将复杂度从3次方降到了2次方。在四数之和中,我们固定a和b,双指针寻找c和d。将复杂度从4次方降到了3次方。
1.考虑剪枝情况。如果nums[a]比目标和值大,就一定不可能找到结果吗?如nums[a]是正数,它作为四元组中最小的数都大于结果,那么必定找不到结果了。如果是nums[a]是负数,它大于目标和target(也是一个负数),还可能出现大于nums[a]的负数,比如nums[b]负数,nums[a]+nums[b]会变得更小,是一个更小的负数,还是有可能找到结果的。
2.考虑整数溢出情况,使用long。Java中int类型的最小值是-2147483648,最大值是2147483647。在这个样例中,和可能越界了。
在这里插入图片描述

java">class Solution {public List<List<Integer>> fourSum(int[] nums, int target) {Arrays.sort(nums);int len=nums.length;ArrayList<List<Integer>> res=new ArrayList<>();for(int a=0;a<len-3;a++){//剪枝:正数最小的数a都大于目标了,肯定没结果。如果是大于目标的负数a,负数a+负数b还是可能小于目标的。if(nums[a]>target&&nums[a]>=0){break;}if(a-1>=0&&nums[a-1]==nums[a]){//去重acontinue;}for(int b=a+1;b<len-2;b++){//剪枝:if(nums[a]+nums[b]>target&&nums[a]+nums[b]>=0){break;}if(b-1>a&&nums[b-1]==nums[b]){//去重bcontinue;}long t=target-(long)(nums[a]+nums[b]);//新的寻找目标int c=b+1,d=len-1;while(c<len&&d>b&&c<d){if(t>(long)nums[len-1]+nums[len-2]){break;}if((long)nums[c]+nums[d]==t){ArrayList<Integer> list=new ArrayList<>();list.add(nums[a]);list.add(nums[b]);list.add(nums[c]);list.add(nums[d]);res.add(list);while(c<d&&nums[c+1]==nums[c]){//去重cc++;}while(c<d&&nums[d-1]==nums[d]){//去重d d--;}c++;d--;    }else if((long)nums[c]+nums[d]>t){d--;}else{c++;}}}}return res;}
}

http://www.ppmy.cn/server/142555.html

相关文章

Python_爬虫1_Requests库入门

目录 Requests库 7个主要方法 Requests库的get()方法 Response对象的属性 爬取网页的通用代码框架 理解requests库的异常 HTTP协议及Requests库方法 HTTP协议 HTTP协议采用URL作为定位网络资源的标识。 HTTP协议对资源的操作 理解PATCH和PUT的区别 HTTP协议与Requse…

光驱验证 MD5 校验和

步骤 1&#xff1a;在 Ubuntu 上打包文件并生成 MD5 校验和 打包文件 使用 tar 命令将文件夹打包成 tar.gz 文件&#xff1a; tar -czvf my_files.tar.gz /path/to/folder 生成 MD5 校验和 使用 md5sum 命令生成打包文件的 MD5 校验和&#xff1a; md5sum my_files.tar.g…

〔 MySQL 〕数据类型

目录 1.数据类型分类 2 数值类型 2.1 tinyint类型 2.2 bit类型 2.3 小数类型 2.3.1 float 2.3.2 decimal 3 字符串类型 3.1 char 3.2 varchar 3.3 char和varchar比较 4 日期和时间类型 5 enum和set mysql表中建立属性列&#xff1a; 列名称&#xff0c;类型在后 n…

安全见闻4

声明&#xff01; 学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团队无关&#…

完全二叉树的节点个数

给你一棵 完全二叉树 的根节点 root &#xff0c;求出该树的节点个数。 完全二叉树 的定义如下&#xff1a;在完全二叉树中&#xff0c;除了最底层节点可能没填满外&#xff0c;其余每层节点数都达到最大值&#xff0c;并且最下面一层的节点都集中在该层最左边的若干位置。若最…

【拥抱AI】对比embedding模型gte-Qwen2-7B-instruct和bge-m3:latest(二)

为了更好地理解 gte-Qwen2-7B-instruct 和 bge-m3:latest 在不同任务中的表现&#xff0c;我们可以从以下几个方面进行详细对比&#xff1a; 1. 文本生成 gte-Qwen2-7B-instruct 优势&#xff1a; 指令跟随能力&#xff1a;该模型经过大量指令-响应对的训练&#xff0c;能够…

构建客服知识库:企业效率提升的关键步骤

客服知识库是企业提升客户服务效率和质量的重要工具。它不仅帮助客服团队快速准确地回答客户问题&#xff0c;还能通过数据分析来优化服务流程和提升客户满意度。 1. 明确知识库的目标和范围 构建客服知识库的第一步是明确其目标和范围。这包括确定知识库的主要用户群体、需要…

Rust面向对象特性

文章目录 封装基于特征对象vs基于泛型基于特征对象静态派遣和动态派遣静态派遣&#xff08;Static Dispatch&#xff09;动态派遣&#xff08;Dynamic Dispatch&#xff09; 基于泛型 状态设计模式面向对象的思想rust思想&#xff1a;将状态和行为编码为类型&#xff08;将状态…