算法学习Day7 链表
454. 四数相加 II
/**
* @param {number[]} nums1
* @param {number[]} nums2
* @param {number[]} nums3
* @param {number[]} nums4
* @return {number}
*/
var fourSumCount = function(nums1, nums2, nums3, nums4) {
const twoSumMap = new Map();
let count = 0;
// 将两个数之和的值作为key存入map,value的值为得到这个和的次数,先判断是否存在这个key,不存在输入value:1,存在则原值+1
for(const n1 of nums1) {
for(const n2 of nums2) {
const sum = n1 + n2;
let temp = twoSumMap.get(sum) ? twoSumMap.get(sum)+1 : 1
twoSumMap.set(sum, temp)
}
}
for(const n3 of nums3) {
for(const n4 of nums4) {
const sum = n3 + n4;
//判断是否存在key等于target-sum 即0-sum(另外两个数之和)
//若存在则计数,key对应value即为存在的次数
twoSumMap.get(0 - sum) ? count += twoSumMap.get(0 - sum) : count
}
}
return count;
};
383. 赎金信
暴力
/**
* @param {string} ransomNote
* @param {string} magazine
* @return {boolean}
*/
var canConstruct = function(ransomNote, magazine) {
if(ransomNote.length>magazine.length) return false
let ransomArr = ransomNote.split('')
let magazineArr = magazine.split('')
for(let i=0;i<magazineArr.length;i++){
for(let j=0;j<ransomArr.length;j++){
// 如果ransomNote里的字母存在于magazine,则删除这个字母
if(magazineArr[i] == ransomArr[j]){
ransomArr.splice(j,1)
break
}
}
}
//如果都删除了就说明 ransomNote 能由 magazine 里面的字符构成
if(ransomArr.length === 0){
return true
}
return false
}
哈希
/**
* @param {string} ransomNote
* @param {string} magazine
* @return {boolean}
*/
var canConstruct = function(ransomNote, magazine) {
if(ransomNote.length>magazine.length) return false
let newArr = new Array(26).fill(0)
const aAscii = 'a'.charCodeAt()
for(let i of magazine){
newArr[i.charCodeAt()-aAscii] += 1
}
for(let i of ransomNote){
newArr[i.charCodeAt()-aAscii] -= 1
//判断若小于0则说明ransomNote中的一个字母不存在于magazine中,即ransomNote不能由 magazine 里面的字符构成
if(newArr[i.charCodeAt()-aAscii]<0) return false
}
return true
}
还有两题没有弄明白,周末补。。