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
描述#
第一次提交的代码#
import java.util.Map;
import java.util.HashMap;
class Solution {
public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {
//四数相加退化成两数之和,但是时复会变为O(n^2)
int lenOfMul=nums1.length*nums1.length;
int count=0;
int minus=0;
Map<Integer,Integer> map = new HashMap<>();
for(int i=0;i<nums1.length;i++){
for(int j=0;j<nums1.length;j++){
int temp=nums1[i]+nums2[j];
if(map.containsKey(temp)){
map.put(temp,map.get(temp)+1);
}else{
map.put(temp,1);
}
}
}
for(int i=0;i<nums1.length;i++){
for(int j=0;j<nums1.length;j++){
minus=(0-(nums3[i]+nums4[j]));
if(map.containsKey(minus)){
count+=map.get(minus);
}
}
}
return count;
}
}
思路:
四数相加退化成两数之和,但是O(n)会变成O(n^2),没办法,给的数组有四个,这个时间复杂度相对还正常的- -,也不能说退化成两数之和吧,毕竟两数之和的代码逻辑搞不好的话执行时间就差的比较多了。
因为这个题目并不需要返回元组索引,所以在遍历前两个数组的时候,用HashMap来存储各个索引相加的值(键),索引值相加结果出现的次数作为值,这样在遍历后两个数组的时候,就可以知道当前两个索引相加结果在之前两个数组出现的次数,变相的实现了(i, j, k, l)。
学习到的东西#
我Java基础还是菜,map.getOrDefault(key,initVal)这个方法居然都没想起来,菜狗啊...
用了map的这个方法,执行速度快了不少。
更新的代码如下:
import java.util.Map;
import java.util.HashMap;
class Solution {
public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {
//四数之和退化成两数之和,但是时复会变为O(n^2)
int lenOfMul=nums1.length*nums1.length;
int count=0;
int minus=0;
Map<Integer,Integer> map = new HashMap<>();
for(int i=0;i<nums1.length;i++){
for(int j=0;j<nums1.length;j++){
int temp=nums1[i]+nums2[j];
map.put(temp,map.getOrDefault(temp,0)+1);
}
}
for(int i=0;i<nums1.length;i++){
for(int j=0;j<nums1.length;j++){
minus=(0-(nums3[i]+nums4[j]));
count+=map.getOrDefault(minus,0);
}
}
return count;
}
}
作者:whitePuPigeon
出处:https://www.cnblogs.com/whitePuPigeon/p/17783616.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构