代码随想录算法训练营第七天
454. 四数相加 II
let fourSumCount = function (nums1, nums2, nums3, nums4) {
// 哈希表可以用const声明
const map = new Map()
let count = 0
for (const num1 of nums1) {
for (const num2 of nums2) {
const sum = num1 + num2
// map[sum]++ <- JS不能这么写!
// map.get(sum) || 0 相当于 map.get(sum) ? map.get(sum) : 0
map.set(sum, 1 + (map.get(sum) || 0))
}
}
for (const num3 of nums3) {
for (const num4 of nums4) {
const sum = num3 + num4
// 如果有匹配,0 - sum就是上面的sum
// 同样防止将undefined带入运算,设置||运算符
count += (map.get(0 - sum) || 0)
}
}
return count
}
383. 赎金信
let canConstruct = function (ransomNote, magazine) {
const map = new Map()
const base = 'a'.codePointAt(0)
for (const char of magazine) {
const index = char.codePointAt(0) - base
map.set(index, 1 + (map.get(index)||0))
}
for (const char of ransomNote){
const index = char.codePointAt(0) - base
map.set(index, -1 + (map.get(index)||0))
if (map.get(index) < 0){
return false
}
}
return true
}
本题和242. 有效的字母异位词是一个思路
可以把复杂的表达式赋值给一个变量,这样避免出错
15. 三数之和
var threeSum = function(nums) {
const res = [], len = nums.length
// 将数组排序
nums.sort((a, b) => a - b)
for (let i = 0; i < len; i++) {
let left = i + 1, right = len - 1, iNum = nums[i]
// 数组排过序,如果第一个数大于0直接返回res
if (iNum > 0) return res
// 去重
if (iNum == nums[i - 1]) continue
while(left < right) {
let lNum = nums[left], rNum = nums[right], threeSum = iNum + lNum + rNum
// 三数之和小于0,则左指针向右移动
if (threeSum < 0) left++
else if (threeSum > 0) right--
else {
res.push([iNum, lNum, rNum])
// 去重
while(left < right && nums[left] == nums[left + 1]){
left++
}
while(left < right && nums[right] == nums[right - 1]) {
right--
}
left++
right--
}
}
}
return res
};
18. 四数之和
var fourSum = function(nums, target) {
const len = nums.length;
if(len < 4) return [];
nums.sort((a, b) => a - b);
const res = [];
for(let i = 0; i < len - 3; i++) {
// 去重i
if(i > 0 && nums[i] === nums[i - 1]) continue;
for(let j = i + 1; j < len - 2; j++) {
// 去重j
if(j > i + 1 && nums[j] === nums[j - 1]) continue;
let l = j + 1, r = len - 1;
while(l < r) {
const sum = nums[i] + nums[j] + nums[l] + nums[r];
if(sum < target) { l++; continue}
if(sum > target) { r--; continue}
res.push([nums[i], nums[j], nums[l], nums[r]]);
// 对nums[left]和nums[right]去重
while(l < r && nums[l] === nums[++l]);
while(l < r && nums[r] === nums[--r]);
}
}
}
return res;
};