今天是第6天刷leetcode,立个flag,打卡60天。
算法挑战链接
454. 四数相加 IIhttps://leetcode.cn/problems/4sum-ii/
第一想法
理解题目:找到四个数相加等于0 ——> 找到两个互为相反的数
理解完题目之后,那么我们要做的就是找到 nums1[i] + nums2[j] = - ( nums3[k] + nums4[l] )
那么我会想用一个map来存储 nums1[i] + nums2[j] 情况,key为相加的结果,value为出现的次数
那么再次去遍历nums3[k] + nums4[l]的时候只要去找到map中是否有互为相反的数即可,如果有,则将出现的次数累加即可。
总的来说步骤如下:
- 首先定义 一个unordered_map,key放a和b两数之和,value 放a和b两数之和出现的次数。
- 遍历大A和大B数组,统计两个数组元素之和,和出现的次数,放到map中。
- 定义int变量count,用来统计 a+b+c+d = 0 出现的次数。
- 在遍历大C和大D数组,找到如果 0-(c+d) 在map中出现过的话,就用count把map中key对应的value也就是出现次数统计出来。
- 最后返回统计值 count 就可以了
代码如下:
class Solution {
public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {
int res = 0;
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
//统计两个数组中的元素之和,同时统计出现的次数,放入map
for (int i : nums1) {
for (int j : nums2) {
int sum = i + j;
map.put(sum, map.getOrDefault(sum, 0) + 1);
}
}
//统计剩余的两个元素的和,在map中找是否存在相加为0的情况,同时记录次数
for (int i : nums3) {
for (int j : nums4) {
res += map.getOrDefault(0 - i - j, 0);
}
}
return res;
}
}
看完代码随想录之后的想法
想法一致
实现过程中遇到哪些困难
没有遇到什么困难
今日收获
无