多个数组四数相加
主要思路:
- 四个数组做循环时间复杂度太高
- 利用哈希表做计数可以将四个嵌套循环,分为两个双层嵌套循环
完整代码:
/**
* @param {number[]} nums1
* @param {number[]} nums2
* @param {number[]} nums3
* @param {number[]} nums4
* @return {number}
*/
var fourSumCount = function(nums1, nums2, nums3, nums4) {
let count =0
let map=new Map()
for(let i=0;i<nums1.length;i++){
for(let j=0;j<nums2.length;j++){
let sum = nums1[i]+nums2[j]
if(!map.has(sum)){
map.set(sum,1)
}else{
let c=map.get(sum)
c++
map.set(sum,c)
}
}
}
for(let i=0;i<nums3.length;i++){
for(let j=0;j<nums4.length;j++){
let sum=nums3[i]+nums4[j]
if(map.has(-sum)){
count+=map.get(-sum)
}
}
}
return count
};
赎金信
主要思路:
- 有效的字母异位词 是一个思路
- 但是有一个点要特别注意,跟有效的字母异位词不同的是赎金信使允许多的字母的,所以判断条件可以是<0就返回flase
完整代码
/**
* @param {string} ransomNote
* @param {string} magazine
* @return {boolean}
*/
var canConstruct = function(ransomNote, magazine) {
let resArr = new Array(26).fill(0)
let a='a'.charCodeAt()
magazine.split('').forEach(item=>{
resArr[item.charCodeAt()-a]++
})
ransomNote.split('').forEach(item=>{
resArr[item.charCodeAt()-a]--
})
for(let i of resArr){
if(i<0){
return false
}
}
return true
};