代码随想录算法营Day07:哈希表 (二)

文章介绍了使用JavaScript实现的几种算法,包括四数相加II问题和三数之和问题,利用哈希表优化求解过程,提高效率。同时提到了赎金信问题,通过字符编码进行计数。所有解决方案都注重了去重和排序来简化问题。
摘要由CSDN通过智能技术生成

代码随想录算法训练营第七天

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;
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值