454. 四数相加 II
解题
这道题由于是从四个数组中找相加等于0的个数,不用考虑重复的四个元素相加等于0的情况,所以可以使用哈希表来解决。
解题步骤:
- 定义哈希表,存放a,b两数之和和出现的次数(遍历A、B两个数组)
- 遍历C、D两个数组,统计c、d之和为(0-(a+b))出现的次数
代码如下:
var fourSumCount = function(nums1, nums2, nums3, nums4) {
const twoSumMap = new Map()
let count = 0
for(let n1 of nums1) {
for(let n2 of nums2) {
let sum = n1 + n2
twoSumMap.set(sum,(twoSumMap.get(sum) || 0) + 1)
}
}
for(let n3 of nums3) {
for(let n4 of nums4) {
let sum = n3 + n4
count += (twoSumMap.get(0 - sum) || 0)
}
}
return count
};
383.赎金信
分析
这道题有两个需要注意的点
magazines里面的字母不能重复利用。- 两个字符串只含有小写字母
根据这两个特性,我们可以想到使用哈希表来完成
解题
由于在本题的情况下,使用map的空间消耗要比数组大,我们可以使用数组来模拟哈希表实现。
代码如下:
var canConstruct = function(ransomNote, magazine) {
const strArr = new Array(26).fill(0)
let base = 'a'.charCodeAt()
for(let i of magazine) {
strArr[i.charCodeAt() - base]++
}
for(let i of ransomNote) {
if(!strArr[i.charCodeAt() - base]) return false
strArr[i.charCodeAt() - base]--
}
return true
};
15.三数之和
分析
这道题的主要难点在于不能包含重复的三元组,对于使用哈希表来解题的话,很难去重。看了题解后学习了用指针的方法解决本题,但是其中的去重依旧得好好琢磨。
解题
过几天再刷一遍再写题解