java数据结构与算法刷题-----LeetCode18. 四数之和

2024-02-12 14:12

本文主要是介绍java数据结构与算法刷题-----LeetCode18. 四数之和,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846

在这里插入图片描述

解题思路
  1. 此题为三数之和的衍生题,代码完全一样,只不过多了一层for循环,而多的这一层for循环,也只不过是再复制一份三数之和的for循环罢了
🏆LeetCode15. 三数之和https://blog.csdn.net/grd_java/article/details/136010556
  1. 思路和三数之和完全一样,先排序。然后枚举数组左边界,作为第一个数
  2. 然后因为多了一个数,所以我们使用同样的代码,枚举剩余3个数的左边界,作为第二个数
  3. 然后在3个数的左边界,右边区域,使用双指针进行枚举。
代码,时间复杂度O(n^3),空间复杂度,排序算法使用快速排序,需要O(logN)的栈空间复杂度。

在这里插入图片描述

class Solution {public List<List<Integer>> fourSum(int[] nums, int target) {//quadruple单词表示 4倍,4重的。quadruplet 表示四组,四套List<List<Integer>> quadruplets = new ArrayList<List<Integer>>();if(nums == null || nums.length < 4) return quadruplets;//排序Arrays.sort(nums);int length = nums.length;//枚举第一个数for(int i = 0; i < length - 3; i++){//因为需要4个数,所以第一个数,最多到倒数第4个数int x = nums[i];//拿到当前遍历的左边界,也就是4个数的第一个数if(i > 0 && x == nums[i-1]) continue;//跳过重复数字,枚举过的,不重复枚举//优化:数组已经排好序(升序),如果x+后面3个数就已经 > 0 了,那当前范围内,最小的3个数都超过目标值,后面的数越来越大,更不行//而且,这一趟都已经超过target了,后面每一趟,就更不行了,所以直接break,不用继续循环了if((long)x + nums[i+1] + nums[i+2] + nums[i+3] > target) break;//优化:如果x+倒数3个数都小于target的话,说明最大的几个数都比目标值小,那么其它的数都比它更小,更无法满足条件了//仅仅这一趟比目标值小,因为x会越来越大,所以后面可能还有满足条件的,所以只是continue跳过这一趟if((long)x + nums[length-1] + nums[length-2] + nums[length-3] < target) continue;//枚举第二个数,下面就是3数之和的代码了for(int j = i+1; j<length-2; j++){int y = nums[j];//拿到当前遍历的三数之和左边界,也就是4个数的第二个数if(j > i+1 && y == nums[j-1]) continue;if((long)x + y + nums[j+1] + nums[j+2] > target) break;if((long)x + y + nums[length-1] + nums[length-2] < target) continue;//双指针枚举另外两个数int left = j + 1, right = length - 1;while(left < right){int z = nums[left], t = nums[right];long sum = (long)x + y + z + t;//4数之和if(sum > target) --right;else if(sum < target) ++ left;else{// quadruplets.add(List.of(x,y,z,t));//下面这行和上面这行效果一样quadruplets.add(Arrays.asList(x,y,z,t));// while(left<right && nums[left]==nums[left+1])left++;// left++;// 下面这句和上面两行效果一样for(++left;left<right && nums[left] == nums[left-1]; ++left);for(--right; right>left && nums[right] == nums[right+1]; --right);}//end_else}//end_while}//end_for}//end_forreturn quadruplets;}//end_method
}//end_class

这篇关于java数据结构与算法刷题-----LeetCode18. 四数之和的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/702738

相关文章

Java实现在Word文档中添加文本水印和图片水印的操作指南

《Java实现在Word文档中添加文本水印和图片水印的操作指南》在当今数字时代,文档的自动化处理与安全防护变得尤为重要,无论是为了保护版权、推广品牌,还是为了在文档中加入特定的标识,为Word文档添加... 目录引言Spire.Doc for Java:高效Word文档处理的利器代码实战:使用Java为Wo

SpringBoot日志级别与日志分组详解

《SpringBoot日志级别与日志分组详解》文章介绍了日志级别(ALL至OFF)及其作用,说明SpringBoot默认日志级别为INFO,可通过application.properties调整全局或... 目录日志级别1、级别内容2、调整日志级别调整默认日志级别调整指定类的日志级别项目开发过程中,利用日志

Java中的抽象类与abstract 关键字使用详解

《Java中的抽象类与abstract关键字使用详解》:本文主要介绍Java中的抽象类与abstract关键字使用详解,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、抽象类的概念二、使用 abstract2.1 修饰类 => 抽象类2.2 修饰方法 => 抽象方法,没有

SpringBoot 多环境开发实战(从配置、管理与控制)

《SpringBoot多环境开发实战(从配置、管理与控制)》本文详解SpringBoot多环境配置,涵盖单文件YAML、多文件模式、MavenProfile分组及激活策略,通过优先级控制灵活切换环境... 目录一、多环境开发基础(单文件 YAML 版)(一)配置原理与优势(二)实操示例二、多环境开发多文件版

Spring 中的切面与事务结合使用完整示例

《Spring中的切面与事务结合使用完整示例》本文给大家介绍Spring中的切面与事务结合使用完整示例,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考... 目录 一、前置知识:Spring AOP 与 事务的关系 事务本质上就是一个“切面”二、核心组件三、完

Java实现远程执行Shell指令

《Java实现远程执行Shell指令》文章介绍使用JSch在SpringBoot项目中实现远程Shell操作,涵盖环境配置、依赖引入及工具类编写,详解分号和双与号执行多指令的区别... 目录软硬件环境说明编写执行Shell指令的工具类总结jsch(Java Secure Channel)是SSH2的一个纯J

JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法

《JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法》:本文主要介绍JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法,每种方法结合实例代码给大家介绍的非常... 目录引言:为什么"相等"判断如此重要?方法1:使用some()+includes()(适合小数组)方法2

SpringBoot 获取请求参数的常用注解及用法

《SpringBoot获取请求参数的常用注解及用法》SpringBoot通过@RequestParam、@PathVariable等注解支持从HTTP请求中获取参数,涵盖查询、路径、请求体、头、C... 目录SpringBoot 提供了多种注解来方便地从 HTTP 请求中获取参数以下是主要的注解及其用法:1

HTTP 与 SpringBoot 参数提交与接收协议方式

《HTTP与SpringBoot参数提交与接收协议方式》HTTP参数提交方式包括URL查询、表单、JSON/XML、路径变量、头部、Cookie、GraphQL、WebSocket和SSE,依据... 目录HTTP 协议支持多种参数提交方式,主要取决于请求方法(Method)和内容类型(Content-Ty

深度解析Java @Serial 注解及常见错误案例

《深度解析Java@Serial注解及常见错误案例》Java14引入@Serial注解,用于编译时校验序列化成员,替代传统方式解决运行时错误,适用于Serializable类的方法/字段,需注意签... 目录Java @Serial 注解深度解析1. 注解本质2. 核心作用(1) 主要用途(2) 适用位置3