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

LeetCode 第18题:四数之和的解析 题目要求:给定一个包含n个整数的数组nums和一个目标值target,找出nums中的四个整数,使得它们的和与target相等。返回所有四元组(a, b, c, d),使得a + b + c + d = target。注意:答案中不可以包含重复的四元组。在这篇博客中,我们详细讲解了如何解决LeetCode第18题:四数之和。通过使用双指针法,我们成功地在时间复杂度为O(n^3)的情况下找到了所有满足条件的四元组。此外,我们还讨论了哈希表法、回溯法和动态规划作为替代方法。双指针法。 阅读详情
java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.youkuaiyun.com/grd_java/article/details/123063846

在这里插入图片描述

解题思路
  1. 此题为三数之和的衍生题,代码完全一样,只不过多了一层for循环,而多的这一层for循环,也只不过是再复制一份三数之和的for循环罢了
🏆LeetCode15. 三数之和https://blog.youkuaiyun.com/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_for
        return quadruplets;
    }//end_method
}//end_class
(王道408考研数据结构)第八章排序-第一节:排序综述 文章目录一:排序一览二:简单插入排序(1)基本思想 一:排序一览 排序方法 类别 本文 时间复杂度 是否稳定 直接插入排序 插入排序 跳转 O(n2)O\left ( n^{2}\right )O(n2) 是 二叉树深度 简单 跳转 LeetCode 递归 翻转二叉树 简单 跳转 LeetCode 递归 相同的树 简单 跳转 LeetCode 递归 是否为子树 简单 跳转 LeetCode 递归 对称二叉树 简单 跳转 LeetCode 递归 平衡二叉树 简单 跳转 阅读详情

相关推荐

瑞芯微RK3576上手实测:8nm新U配6TOPS NPU,做AIoT项目选它还是RK3588/RK3568?

本文深度评测瑞芯微RK3576芯片在中高端AIoT项目中的表现,对比RK3588和RK3568的性能差异。RK3576采用8nm工艺,配备6TOPS NPU,在解码能力、AI推理效率和功耗控制方面表现均衡,是中端项目的黄金选择。实测数据显示其在多路视频解码和AI加速性能上优势明显,特别适合智能摄像头和工业HMI设备。

weixin_42627853的博客 717

Java【手撕双指针】LeetCode 18. “四数之和“, 图文详解思路分析 + 代码

"查找的本质是排除", 利用干这一思想 + 使用对撞双指针, 快速解出"四数之和", 本题和 "三数之和(以两数之和为基础)" 的思想基本一致

yzhcjl_的博客 834

【软件介绍】GWAS meta分析软件:METAL

Meta-analysis是对多个GWAS分析结果进行综合评价。METAL是GWAS meta分析最常用的工具之一,本文简单介绍METAL软件基本用法。

hucy_Bioinfo 1万+

四数之和java版

在确定第一个数之后,如果nums[i] + nums[n-3] + nums[n-2] + nums[n-1] < target ,代表第一个数与数组中的三个最大数之和都小于目标值了,则说明后面剩下的三个数无论取什么值,四数之和一定小于target,则需要进入下一轮循环,枚举nums[i+1];在确定前两个数之后,如果nums[i] + nums[j] + nums[j+1] + nums[j+2] > target ,说明剩下的两个数,无论取什么值,四个数之和一定会大于taret,因此退出第二层循环;

weixin_44978244的博客 678

ZYNQ千兆网UDP通信实战:从Vivado配置到LWIP优化全流程(附避坑指南)

本文详细介绍了在ZYNQ平台上实现千兆以太网UDP通信的全流程,包括Vivado硬件配置、LWIP协议栈优化及实战代码示例。通过关键参数调整和性能优化,系统吞吐量可提升至850Mbps以上,适用于高速网络通信场景。

weixin_29161785的博客 231

海思MIPI屏调试实战:从参数计算到点亮屏幕的完整指南

本文提供了一份海思平台MIPI屏幕调试的完整实战指南。文章以Hi3516DV300调试800x1280分辨率屏幕为例,详细讲解了从参数计算、配置文件修改到最终点亮屏幕的全流程,并分享了常见问题排查与进阶优化技巧,旨在帮助嵌入式开发者高效解决MIPI屏调试难题。

weixin_29190573的博客 738

四数之和(java实现)

四数之和 给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等?找出所有满足条件且不重复的四元组。 示例: 给定数组 nums = [1, 0, -1, 0, -2, 2],和 target = 0。 满足要求的四元组集合为: [ [-1, 0, 0, ...

jiaobiandianliu的博客 1322

SAP ABAP实战:用GN_DELIVERY_CREATE批量创建内部交货单的完整代码与避坑指南

本文详细介绍了在SAP ABAP开发中使用GN_DELIVERY_CREATE函数批量创建内部交货单的完整实现方案。通过数据结构设计、多源数据整合、批量处理逻辑和错误处理机制等核心环节的深入解析,帮助开发者高效完成物流单据自动化处理,特别针对VL31N/VL32N等常见场景提供避坑指南。

weixin_42116058的博客 343

力扣18 四数之和 Java版本

给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复):

m0_47066863的博客 560

⭐️VMwareWorkstation17.0虚拟机安装搭建Windows 7虚拟机(完整图文详细步骤含配置VMware Tools教程)

本教程为大家提供了从安装VMware Workstation 17.0开始,到在虚拟机上成功搭建Windows 7专业版系统的完整步骤。我们详细介绍了准备阶段所需的软件和硬件要求,以及在VMware中配置和安装Windows 7系统的每一步操作。此外,我们还特别提到了如何在虚拟机上配置VMware Tools,以便更好地与宿主机进行交互。 通过本教程的学习,读者不仅能够掌握在VMware Workstation 17.0上安装Windows 7虚拟机的技能,还能了解到如何配置虚拟机的硬件以及安装VMwar

Python老吕的博客 2万+

LVGL core group焦点分组管理(lv_group.c)

lv_group_t是用于焦点管理的,将需要获取焦点的对像加入到同一个分组内,再将其通过挂到指定的事件驱动中,就可以控制焦点了。而被加入的对象又可以通过焦点状态事件和事件来控制对象的焦点逻辑了。创建好的分组通过接口挂事件驱动中,这样就可以指定一个自定义的焦点分组了。;) {if(!} }友情提示:无论是接口还是都是单例的,即被设置后前一个被设置的值就失效了;此方案可以保证焦点的唯一 性,但也一定要记住要在适合的位置设置回来,以防丢失焦点。

Bigan(安)的博客 3909

LeetCode做题总结 15. 三数之和、18. 四数之和 (Java)

LeetCode做题总结 15. 三数之和、18. 四数之和 (Java)

yavlgloss的博客 616

Ultralytics 框架中 model.predict() 返回的 results 对象的详细解析

通过掌握 results 对象的使用方法,您可以快速实现模型部署、数据分析与可视化。

浩瀚之水的专栏 749

【LeetCode-18】四数之和

LeetCode-18】四数之和,本文将详细讲解如何解决经典的“四数之和”问题。我们会从问题的背景出发,逐步分析解题思路,并通过清晰的案例执行过程展示每一步的逻辑推导。同时,我们还会提供完整的Java代码实现,并对代码进行详细的注释说明。

qq_44530108的博客 1064

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

LeetCode刷题汇总

剑指offer 剑指 Offer 03 数组中重复的数字 剑指 Offer 04 二维数组中的查找 剑指 Offer 05 替换空格 剑指 Offer 06 从尾到头打印链表 剑指 Offer 07 重建二叉树 剑指 Offer 09 用两个栈实现队列 剑指 Offer 10- I 斐波那契数列 剑指 Offer 10- II 青蛙跳台阶问题 剑指 Offer 11 旋转数组的最小数字 剑指 Offer 12 矩阵中的路径 剑指 Offer 13 机器人的运动范围 剑指 Offer 14- I 剪绳子 剑指

weixin_44171872的博客 2万+

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

LeetCode(C++)刷题计划:18-四数之和

18-四数之和 @Author:CSU张扬 @Email:csuzhangyang@gmail.com or csuzhangyang@qq.com Category Difficulty Pass rate Tags Companies algorithms Medium 36.01% array / hash-table / two-pointers linkedin ...

神奇小海螺的博客 8259

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

两数之和、三数之和、四数之和

若 nums[left] + nums[right] < target,此时 nums[right] 为最大值,不能再增加了,因此我们需要让 nums[left] 变大,因此 left++,让 nums[left] 增加。若 nums[left] + nums[right] > target,此时 nums[left] 为最小值,不能再减小了,因此,我们让 right--,减小 nums[right] 的值,从而让两数之和减小。

2301_76161469的博客 1458

力扣第18题:四数之和

力扣第18题:四数之和。接下来我们开始循环,我们做三数之和时候采用一个循环,两个指针就可以求得解,但是我们求四数之和时,一个循环是显然不够用的,我们需要采取双循环来遍历前面两个数,再使用双指针来决定后面两个数。当然我们还可以进一步缩减循环次数,我们可以在每一重循环中判断当前循环的所对应的最大值和最小值。双指针那块的流程在前面三数之和中已经叙述过,这里就不再赘述,可以在博主的主页中进行查看。输出:[[-2,-1,1,2],[-2,0,0,2],[-1,0,0,1]]首先,我们对数组进行排序,避免去重操作消耗大

一位想要成为优秀全栈工程师的有志青年! 827

代码随想录算法训练营第七天|454. 四数相加 II 383. 赎金信 15. 三数之和 18. 四数之和

哈希2,双指针法是重点

Ustianan的博客 2103

LeetCode刷题攻略

通过这套方法,一般3-6个月可系统提升算法能力。例如,某学员按此方案从AC率40%提升至周赛稳定3题,最终获得微软Offer。关键在于坚持结构化训练而非碎片化刷题。刷 LeetCode 是提升算法和数据结构能力的高效方式,但需要科学的方法才能事半功倍。

Dontla的博客 4486

第18题. 四数之和

那么nums【a】+ nums【b】> target时我们只要确保之后的nums【c】+ nums【d】和(nums【a】+ nums【b】)相加不会导致大小减少就好,即 nums【b】>0时 nums【c】、nums【d】也必然>0;或者target>0时,就必然说明nums【b】>0了。这里剪枝 剪的是 外循环确定下来的nums【a】+ nums【b】,而且本题 相加之和不是0 而是target,自然也不能是nums【a】+ nums【b】> 0了;请你找出并返回满足下述全部条件且。

2402_87038419的博客 553

力扣18题解:四数之和(java实现)

LeetCode第18题是一个经典的四数之和问题,通过这个问题,我们可以加深对哈希表和双指针技巧的理解。掌握这个问题的解法,对于解决其他类似问题非常有帮助。

2301_77695569的博客 858

Java实现 LeetCode 18 四数之和

18. 四数之和 给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 ...

5387

代码随想录算法训练营Day7 | 454.四数相加Ⅱ、383.赎金信、15.三数之和、18.四数之和

训练营第七天:454.四数相加Ⅱ、383.赎金信、15.三数之和、18.四数之和

jiabao0520的博客 850

LeetCode:四数之和【18】

LeetCode:四数之和【18】 题目描述 给定一个包含n 个整数的数组nums和一个目标值target,判断nums中是否存在四个元素 a,b,c和 d,使得a + b + c + d的值与target相等?找出所有满足条件且不重复的四元组。 注意:   答案中不可以包含重复的四元组。 示例:   给定数组 nums = [1, 0, -1, 0,...

weixin_30765319的博客 2301

LeetCode第18题思悟——四数之和(4sum)

LeetCode第18题思悟——四数之和(4sum) 文章目录LeetCode第18题思悟——四数之和(4sum)知识点预告题目要求示例我的思路优秀解法差异分析知识点小结 知识点预告 数组排序预处理:无序变有序; 去重操作的位置选择:去掉冗余代码; 遍历前的预判断处理:快速筛选处理; 题目要求 给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四...

博采众长,自成一派; 363
上一篇: java数据结构与算法刷题-----LeetCode15. 三数之和
下一篇: java数据结构与算法刷题-----LeetCode594. 最长和谐子序列
ydenergy_殷志鹏
博客等级 码龄7年 5887粉丝 543原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ydenergy_殷志鹏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值