java数据结构与算法刷题-----LeetCode454. 四数相加 II

基于 AUTOSAR 的域控产品软件开发进阶探索 本文深入探讨了AUTOSAR架构在汽车域控产品开发中的进阶应用。首先从系统设计角度分析了AUTOSAR分层架构原理及其在域控产品中的优化部署策略;其次详细介绍了Davinci和EBTresos等主流工具链的特点与协同使用方法;然后重点阐述了ASPICE流程与功能安全/信息安全标准的实施要点;最后分享了多核车载芯片(如NXP S32G)的适配经验与优化实践。通过架构设计、工具运用、标准遵循和芯片适配四个维度的专业解析,为域控产品的AUTOSAR开发提供了系统性指导。 阅读详情
java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.youkuaiyun.com/grd_java/article/details/123063846

在这里插入图片描述

解题思路
  1. 共4个数组A,B,C,D,如果暴力枚举,就需要4个for循环,枚举每一种组合。则时间复杂度O( n 4 n^4 n4)
  2. 但是我们现在分为两组,A和B的每一种组合,和C和D的每一种组合. 时间复杂度就变成了2个O( n 2 n^2 n2)
  3. 关键:假设AB组合,有一个值是1.CD组合有一个值是-1.那么这个整体的组合,相加为0,显然是题目想要我们找到的。
  4. 问题时,我们如何将其对应到一起。我们发现这个完全符合题意的组合。如果CD组合的值取负,就和AB组合的值一样了。例如AB组合的数是-1000,CD组合的数是1000,那么CD取负变-1000. 此时两个组合的数就一样了,都是-1000.
  5. 所以我们可以建立 n 2 n^2 n2大小的hash表,存储所有AB组合的数,然后只需要判断CD组合取负后,是否和hash表中元素对应,如果对应,那么它们相加就一定归0.

而对于hash表来说,我们可以用做题的老套路,用数组充当hash表,做题效率更快,但是工作中可不能用这玩意。同时我也会给出用实实在在的Hash表来存储的方法,它的效率略逊于数组直接存取,但是工作中肯定得用这个。而对于做题来说,虽然hash表存储比用数组慢了2ms。但是就是这2ms,却超过了65%的人。而实际工作中,没必要为了这2ms来承受使用数组的风险。

代码:使用Map集合:时间复杂度O(n^ 2 ) 空间复杂度O(n^ 2),使用数组:时间复杂度O(n^2) 空间复杂度O(value) 其中value是数组中元素的取值范围

在这里插入图片描述

下面代码中,一共两个解决方法的代码,注意区分。

class Solution {
    /**
        方法一: 做题效率更高,时间复杂度和法二一样,都是O(n^2),但工作场景没什么意义
        使用数组充当hash表,工作中使用,会造成大量存储空间的浪费。
        它需要创建和数组取值范围一样大的用数组下标充当key,元素值为value的hash表
     */
     public int[] getMaxMin(int[] nums) {//返回数组的最大和最小值
        int min = nums[0], max = nums[0];
        for (int num: nums) {
            if (num < min) min = num;
            else if (num > max) max = num;
        }
        return new int[] {max, min};
    }
    public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {
        /****首先是使用数组作为hash表,需要用数组中最大值和最小值,得到取值范围,然后创建相应大小的hash表 */
        //获取4个数组的最大和最小值new int[]{max,min} 其中[0]存储max最大值,[1]存储最小值
        int[] max_min_1 = getMaxMin(nums1);
        int[] max_min_2 = getMaxMin(nums2);
        int[] max_min_3 = getMaxMin(nums3);
        int[] max_min_4 = getMaxMin(nums4);
        //两两为一组,一组为直接相加,一组为负数相加
        //分别获取两组最大和最小值,注意负数一组,加上负号后,值越大反而越小(比如-1 > -100)
        int max = Math.max(max_min_1[0] + max_min_2[0], -(max_min_3[1] + max_min_4[1]));
        int min = Math.min(max_min_1[1] + max_min_2[1], -(max_min_3[0] + max_min_4[0]));
        //用数组充当哈希表,取值范围为 这正负的两组 最小值到最大值。例如-1000 到 1000.
        int [] hash = new int [max - min + 1];
        int ans = 0;
        /** 下面的操作就和使用Map完全一样了*/
        //分为两组,两个for循环,两个n^2. 比暴力解法4个for循环要好得多
        //正数这一组中,所有取值组合放入hash中
        for (int num1: nums1) {
            for (int num2: nums2) {
                ++hash[num1 + num2 - min];//对应下标位置+1
            }
        }
        //负数这一组,如果取值组合和第一组的相同,那么证明,不取负的话,两组相加会归0
        for (int num3: nums3) {
            for (int num4: nums4) {
                ans += hash[-num3 - num4 - min];//则符合条件,将次数加入答案中
            }
        }
        return ans;
    }
    /**
        法二,因为使用了Map需要hash散列,还得维护hash表,存取效率比不上直接数组索引,但是实际工作中肯定使用
        Map,时间复杂度和法一相同O(n^2). 代码也完全一样。
     */
    public int fourSumCount1(int[] A, int[] B, int[] C, int[] D) {
        //除了用了Map作为hash表外,其余操作完全一样
        Map<Integer,Integer> countAB = new HashMap<Integer,Integer>();
        //分两种,一组正数
        for(int u : A)
            for(int v : B) 
                countAB.put(u + v,countAB.getOrDefault(u + v , 0) + 1);//放入hash
        int ans = 0;
        //一组负数,如果取负后,和第一组正数一致,就表示两组相加,会归0
        for(int u : C)
            for(int v : D)
                if(countAB.containsKey(-u - v))
                    ans += countAB.get(-u - v);//那么就符合答案需要的
        return ans;
    }

}
光通量与辐射通量之间的换算 由理论和实验可知存在两种定义: 1W1W1W(瓦特)的频率为540×1012Hz540\times10^{12}Hz540×1012Hz(赫兹)的单色辐射的辐射通量等于683lm(流明)683lm(流明)683lm(流明).。 1lm1lm1lm的频率为540×1012Hz540\times10^{12}Hz540×1012Hz的单色通量等于1683=0.001464W\frac{1}{683}=0.001464W6831​=0.001464W。 从上述定义中我们可以得到什么呢?我们知道光速: c=3× 阅读详情

相关推荐

Matlab:imageDatastore() 高效读取图像数据集的实战技巧

本文详细介绍了Matlab中imageDatastore()函数的高效使用技巧,帮助用户从繁琐的手动读取图像数据集中解放出来。通过核心语法、关键参数(如IncludeSubfolders、LabelSource、ReadSize)的解析,以及数据集分割、打乱等进阶实战操作,指导读者构建稳定、高效的图像数据读取管道,特别适用于大型图像数据集处理和机器学习项目。

hill8的博客 1101

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

哈希2,双指针法是重点

Ustianan的博客 2103

Redis Lua引擎UAF漏洞CVE-2025-49844深度剖析与复现实践

内存安全是软件系统稳定性的基石,其核心原理在于确保程序对内存的访问始终处于合法、受控的状态。在C/C++等手动管理内存的语言中,Use-After-Free(释放后使用)是一种典型的高危内存安全漏洞,它源于已释放的内存区域仍被程序指针引用,导致数据混乱或程序崩溃。这类漏洞的技术价值在于其往往能突破高级语言的安全边界,直接威胁进程本身,危害等级极高,常见于数据库、浏览器等核心基础设施。在Redis这样的高性能内存数据库中,其内置的Lua脚本引擎为复杂操作提供了强大支持,但同时也引入了沙箱环境下的复杂内存对象生

weixin_42530732的博客 365

Java实现 LeetCode 454 四数相加 II

454. 四数相加 II 给定四个包含整数的数组列表 A , B , C , D ,计算有多少个元组 (i, j, k, l...

5405

vcs 覆盖率收集1——三种覆盖率类型、covergroup、bins、数据采样、覆盖率选项

介绍各种覆盖率,以及如何编写覆盖率收集的代码

qq_42135020的博客 1万+

计算机组成原理实验logisim(四)之运算器实验

注意,上半张图中所有连入32位宽多路选择器的器件和的“数据位宽”都是32,而中间部分连入1位多路选择器的器件的“数据位宽”皆为1(除了连向“32位加法器”的那一个非门,是32位)。第二到第五个实验的测试,具体怎么测试好吧我也不太清楚,听室友说就是让你分析各种亮灯的原理,比如你点这个,那个为什么颜色要变等等,我就不粘图了,恩大家加油。连图如下,需要在连线之前格外注意“异或门”和“与门”的位宽,将16改为1,不然数据无法通行。关于学术问题,为何这样连什么的,就别问我了,我也没有搞的那么透彻。

qq_54422132的博客 2万+

代码随想录算法训练营第十天|1. 两数之和,第454题.四数相加II

在遍历数组的时候,只需要向map去查询是否有和目前遍历元素匹配的数值,如果有,就找到的匹配对,如果没有,就把目前遍历的元素放进map中,因为map存放的就是我们访问过的元素。map目的用来存放我们访问过的元素,因为遍历数组的时候,需要记录我们之前遍历过哪些元素和对应的下标,这样才能找到与当前元素相匹配的(也就是相加等于target)那么判断元素是否出现,这个元素就要作为key,所以数组中的元素作为key,有key对应的就是value,value用来存下标。但是,数组中同一个元素不能使用两遍。

lcy57__的博客 2279

超分算法 SwinIR: Image Restoration Using Swin Transformer

这篇文章结构比较简单,如果看过Swin-Transformer的话就没什么难点了。作者引入Swin-T结构应用于低级视觉任务,包括图像超分辨率重建、图像去噪、图像压缩伪影去除。网络由一个浅层特征提取模块、深层特征提取模块、重建模块构成。重建模块对不同的任务使用不同的结构。浅层特征提取就是一个3×3的卷积层。深层特征提取是k个RSTB块和一个卷积层构成。RSTB(Res- SwinIR: Image Restoration Using Swin Transformer[ICCV 2021]Abstract1.

qq_45122568的博客 1万+

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

到了这里就是最重要的一步,前面已经把nums[i]的值去重了,这里就要把nums[left],nums[right]的值也要去重,因为left是前进的,right是后退的,所以当nums[right]==nums[right-1]时,right--,过滤掉下一个要加的nums[right]值,同理left则是 当nums[left]==nums[left+1]时,left++。因为题目是找一个数组中三个数的和,而且同一个位置的数不能重复出现(就是题目中的i,j,k三个位置),但是不同位置的数值可以重复。

cccoffer的博客 1072

测试用例设计工具大盘点:总有一款适合你

本文旨在帮助测试工程师、开发人员及团队管理者快速了解主流测试用例设计工具的特点、适用场景和选择逻辑。覆盖工具类型包括传统文档工具、开源管理工具、商业集成平台及新兴AI工具,范围涵盖中小团队到大型企业的不同需求。本文从“测试用例设计的痛点”切入,用生活案例解释核心概念;接着按“工具类型”分类盘点主流工具(附优缺点对比表);再通过“小团队/中大型团队/敏捷团队”等真实场景教你选工具;最后展望AI等未来趋势,帮你“一次学透,终身受用”。

项目管理的博客 1593

RabbitMQ高级特性 - 生产者消息确认机制

为了保证信息 从生产者 发送到 队列,因此引入了生产者的消息确认机制.通过事务机制实现.通过发送确认机制(confirm 和 return)实现.因为事务机制比较消耗性能,在实际工作中用的也不多,因此这里主要介绍confirm 和 return机制来实现发送放的确认.a)confirm 确认模式如上图,confirm 确认模式主要保障于 生产者 到 交换机 的消息可靠性.如果 Exchange成功收到消息,那么 ConfirmCallback 这个回调 ack 参数就为true。

CYK_byte的博客 1886

leetcode【哈希表—中等】454.四数相加 II

给你四个整数数组 nums1、nums2、nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足: 0 <= i, j, k, l < n nums1[i] + nums2[j] + nums3[k] + nums4[l] == 0

每个人都是独一无二的,把握好自己的节奏,跟着自己的心走。 543

​非线性分析-增加位移量可能出现下面错误。虽然求解无法在所有时间点完成,但在某些点上仍能够求解部分结果。请参阅“帮助系统”中的故障排除,以了解更多信息详情。由于受约束,规划求解引擎无法收敛

基于收敛状态拆分载荷步‌:在已收敛的载荷步基础上,将未收敛的关键区域拆分为更细的子步,比如在载荷突变点前设置5~10个子步,逐步加载。替换冲突约束为弱约束‌:若存在约束冲突,将刚性约束替换为弱弹簧约束(刚度设为1e-6~1e-4),既限制刚体位移,又不影响结构的变形自由度,命令流:SPRING, NODE, K, 1e-6。部分区域约束完整,但存在未被约束的刚体自由度,或约束类型与大变形/接触逻辑冲突,比如某部件的位移约束在初始阶段有效,但大变形后约束位置脱离实际受力点,导致求解器在该阶段无法收敛。

qq_15963745的博客 145

重生之我在代码随想录刷算法第六天 | 第454题.四数相加II、383. 赎金信、 第15题. 三数之和、第18题. 四数之和

60天算法训练营第6天,中秋节已过,开刷!

qq_73210658的博客 750

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

LeetCode:454. 四数相加 II —— 哈希表为什么叫哈希表~

LeetCode:454. 四数相加 II 给你四个整数数组 nums1、nums2、nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足: 0

Super algorithm 的博客,技术爱好者。 908

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

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

jiabao0520的博客 850

LeetCode 四数相加 II

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Ma...

学习使人进步 392

数据结构算法-哈希表:四数相加II

摘要:本文介绍了LeetCode 454题"四数相加II"的解题方法。给定四个整数数组A、B、C、D,找出满足A[i]+B[j]+C[k]+D[l]=0的元组数量。核心思路是采用分组+哈希表策略:先将A+B的和存入哈希表(和为键,出现次数为值),然后计算C+D的和,在哈希表中查找对应的相反数。这种方法利用空间换时间,将O(n⁴)复杂度优化为O(n²)。文中提供了Java代码实现,包含详细注释,并给出测试用例验证。该方法适用于数组长度≤500的情况,整数范围在-2²⁸到2²⁸-1之间。

destiny_tool的博客 1107

leetcode 454. 4Sum II | 454. 四数相加 II(Java)

题目 https://leetcode.com/problems/4sum-ii/ 题解 四数相加问题。 对于左边两个数两两组合,需要维护一个 map,用来存左边两个数的 sum 以及该 sum 对应的 count。 对于右边两个数两两组合,需要查 map 中是否有可以与之匹配的元素。如果有,将个数累加到 count 中。 class Solution { public int fourSumCount(int[] n1, int[] n2, int[] n3, int[] n4) {

寒泉 4万+

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

代码同样可以再简洁一点,因为这道题不需要每个字母出现频次都相同,而且magazine中的字符必须完全包含rannsomNote,因此在ransomNote遍历时,一旦某个字符count减完后小于0了,说明magazine的字符不够,不满足条件,可以提前return false。此外,为了减少计算次数,当遍历的元素本身已经大于目标值时,由于数组已经排序,右边的元素肯定大于等于该元素,所以可以跳过这一层循环,直接返回。有了三数之和的经验,四数之和的方法也是类似的,不过比三数之和要多套一层遍历。

qq_42973684的博客 980

leetcode_454. 四数相加 II_java

454. 四数相加 II。给你四个整数数组 nums1、nums2、nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足: 0 <= i, j, k, l < n nums1[i] + nums2[j] + nums3[k] + nums4[l] == 0

weixin_46211609的博客 479

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

1. 使用哈希表。2. 前两个数组的和以及出现的次数作为键值对先存储。3. 检查后两个数组和的相反数有没有在哈希表中出现过,出现则获取次数。1. 解题思路和有效的字母异位词解法类似,使用数组(由于字符是有范围的,所以可以定义一个常量大小的数组,很大程度降低了空间复杂度)。1. 先对数组排序。2. 使用双指针法寻找当前和nums[i] 和为0的组合。3. 注意去重:1)对nums[i]去重;2)当找到满足和为0的三个数以后对下一个nums[left]和nums[right去重]。1. 使用指针法。

qq_39981702的博客 1239

【算法刷题day7】Leetcode:454. 四数相加 II、383. 赎金信、15. 三数之和、18. 四数之和

暂无这题可以用Hash数组来解决暂无要想到和三数之和是一个道理454. 四数相加 II代码随想录解析383. 赎金信代码随想录解析15. 三数之和代码随想录解析18. 四数之和代码随想录解析。

qq_45022758的博客 423

代码随想录day7 | leetcode454.四数相加II 383. 赎金信 5. 三数之和 18. 四数之和 总结

一般来说哈希表都是用来快速判断一个元素是否出现集合里。对于哈希表,要知道哈希函数和哈希碰撞在哈希表中的作用。哈希函数是把传入的key映射到符号表的索引上。哈希碰撞处理有多个key映射到相同索引上时的情景,处理碰撞的普遍方式是拉链法和线性探测法。数组set(集合)map(映射)

2302_81139517的博客 1154

Leetcode 454.四数相加II

四数相加II 给定四个包含整数的数组列表A , B , C , D ,计算有多少个元组 (i, j, k, l),使得A[i] + B[j] + C[k] + D[l] = 0。 为了使问题简单化,所有的 A, B, C, D 具有相同的长度N,且 0 ≤ N ≤ 500 。所有整数的范围在 -228 到 228 - 1 之间,最终结果不会超过231 - 1 。 例如: 输...

weixin_30530339的博客 82

代码随想录笔记_哈希_454四数相加II

之后遍历C数组和D数组,将0-(c+d)作为key,在map中查找,如果存在key,则代表a+b+c+d=0,存在四数相加=0的元组。首先遍历A数组和B数组,map的key和value分别记录A数组和B数组的sum,value记录sum出现的次数。输入nums1=[1,2],nums2=[-2,-1],nums3=[-1,2],nums4=[0,2]2.遍历数组A和B,统计两个数的sum,和sum出现的次数。...

Erik_Ying的博客 278
上一篇: java数据结构与算法刷题-----LeetCode349. 两个数组的交集
下一篇: java数据结构与算法刷题-----LeetCode15. 三数之和
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、付费专栏及课程。

余额充值