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

👍解题思路:
本题使用哈希表来进行解题,只需要找到满足nums1[i] + nums2[j] + nums3[k] + nums4[l] == 0并且记录找到的次数,最后返回次数即可。因为这四个数组都是独立的数组,所以不用考虑四个数组相加会出现重复的结果。
1.首先定义一个map,并且指定泛型为<Integer,Integer>,来存储nums1和nums2相加的结果和结果出现的次数;定义变量res来记录最后四个数组相加等于0的个数。
public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {
Map<Integer,Integer> map=new HashMap<>();
int res=0; //记录最后结果
}
2.使用双层for循环遍历数组nums1和nums2,获取它们的元素并且定义临时变量sum来记录两数组相加之和。再把sum存储到先前定义的map并且作为“key”,使用map.getOrDefault()方法来获取sum在map中的值来进行存储,如果存在就把值作为map的“value”,否则就设置默认值为0。最后把value的值加1。
public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {
Map<Integer,Integer> map=new HashMap<>();
int res=0; //记录最后结果
for (int i : nums1) {
for (int j : nums2) {
int sum=i+j; //记录两数组相加
map.put(sum,map.getOrDefault(sum,0)+1); //记录num1和num2相加的和作为"key",对应的值作为"value"
}
}
}
3.再次使用双层for循环来遍历剩下两个数组nums3和nums4,获取两个数组的元素,并且把“0-(nums3[index1]+nums4[index2])”作为“key”的value返回赋值给res变量。
public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {
Map<Integer,Integer> map=new HashMap<>();
int res=0; //记录最后结果
for (int i : nums1) {
for (int j : nums2) {
int sum=i+j; //记录两数组相加
map.put(sum,map.getOrDefault(sum,0)+1); //记录num1和num2相加的和作为"key",对应的值作为"value"
}
}
for (int i : nums3) {
for (int j : nums4) {
res+=map.getOrDefault(0-(i+j),0); //从map中获取值并且赋值给res;key应为0-(i+j),即因为0-(nums3+nums4)=nums1+nums2
}
}
return res;
}
304

被折叠的 条评论
为什么被折叠?



