题目: 454.四数相加II
题目链接/文章讲解/视频讲解: 代码随想录
第一想法:没有想出来
看完代码随想录之后的想法:可以使用哈希来解决;
我们使用的是map,因为a+b+c+d=target,我们可以看成是否存在a+b = target - (c + d);也就是说,我们遍历a , b,计算a + b,然后遍历c,d 看是否存在target - (c + d)的值等于a +b ,如果存在,就是一种情况;因此,我们把a + b 放入map中,然后遍历c ,d 两个数组,如果 发现map 包含了target - ( c + d )说明 满足条件,但是我们呢要注意存放a + b的个数;
class Solution {
public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {
int res = 0;
Map<Integer, Integer> map = new HashMap<>();
for(int n : nums1) {
for(int m : nums2) {
map.put(n + m, map.getOrDefault(n + m, 0) + 1);
}
}
for(int n : nums3){
for(int m : nums4) {
if(map.containsKey(0 - (n + m)))
res += map.get((0 - (n + m)));
}
}
return res;
}
}
题目:383. 赎金信
题目链接/文章讲解:代码随想录
第一想法:使用数组,每一次把第一个字符串放入数组,并且记录一下出现的个数,然后遍历另一个字符串,每一次都把该字符相应的次数减一,如果发现到最后,数组当中存在大于零的数,就return false
看完代码随想录之后的想法:原来数组的大小只用开到26个就行
题目:15. 三数之和
题目链接/文章讲解: 代码随想录
第一想法:当时直接想出来了,用的是双指针,数组先排序,定一个数,然后双指针不断调整,和小的话,左指针右移,大的话,右指针左移,等于的话满足条件
自己实现过程中遇到的困难 :很容易忘记去重,我们在去重的时候,如果有重复的时候,一定先让第一个执行完后,然后跳过后面重复的,这样才能够避免漏掉的情况;
题目: 四数之和
题目链接/文章讲解/视频讲解: 代码随想录
第一想法:和三数之和一样的思路
自己实现过程中遇到的困难 :
会发生溢出,我们要用long 型的sum,然后和target进行比较;
总结:
今天学到了剪枝操作,同时要注意溢出的问题;溢出后会回到最小值 然后再把溢出的部分加在最小值上