总结
虽然是在hash表的章节,但是真的用了好多双指针的做法
L0454. 四数相加 II
分析
首先根据题目的要求, i, j, k, l 之间 以及nums1[i] + nums2[j] + nums3[k] + nums4[l],而且他们是属于四个不同的数组,那么其实并不去要考虑去重。
思路是 将四个数组两两分组,将nums1 与 nums2 中的元素逐个相加就得到了所有可能的和的结果,将和作为key ,这个和出现的次数作为value。
然后遍历nums3[k] + nums4[l] ,取反号作为Key去查找次数即可。
本题的另外一个收获
学到了一个函数
hashmap.getOrDefault(Object key, V defaultValue)
sites.put(1, "Google");
sites.put(2, "Runoob");
String value1 = sites.getOrDefault(4, "Not Found");
System.out.println("Value for key 4: " + value1);
//会输出
Value for key 4: Not Found
题目代码
public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {
//通过双层for循环来得到nums1 和 nums2 的所有情况 并将所有sum的情况出现的次数进行统计
Map<Integer, Integer> sumCountMap = new HashMap<Integer, Integer>();
for(int num1 : nums1){
for(int num2 : nums2){
int sum = num1 + num2;
int conut = sumCountMap.getOrDefault(sum, 0) + 1;
sumCountMap.put(sum, conut);
}
}
//对nums3 和 nums4 进行双层循环 找能够和map里的元素相加等于0的情况
int res = 0;
for(int num3 : nums3){
for(int num4 : nums4){
int sum = 0 - num3 - num4;
int conut = sumCountMap.getOrDefault(sum, 0);
res += conut;
}
}
return res;
}
L0015. 三数之和
题目分析和难点
最难的地方在于怎么去重,这个去重卡了我一个小时。
核心去重代码
if (sum == 0) {
//找到了一组合法数据 但是要判断一下是否重复
boolean b1 = left == i + 1; //此时是第一个肯定不会重复
boolean b2 = (left > i + 1) && (nums[left] != nums[left - 1]); //
if (b1||b2) { //left不重复right自然也不会重复
List<Integer> path = new ArrayList<>();
path.add(nums[i]);
path.add(nums[left]);
path.add(nums[right]);
res.add(path);
}
left++;
right--;
} else if (sum < 0) {
left++;
} else {
right--;
}