代码随想录 | Day06 | 哈希表 part02 | 454.四数相加II | 383. 赎金信 | 15. 三数之和 | 18. 四数之和

61 阅读1分钟

454.四数相加II

主要是使用哈希表存前两数之和,js的map的值操作有点搞,需要记住

var fourSumCount = function(nums1, nums2,nums3, nums4) {
    let CountAB = new Map()
    for(let i of nums1){
        for (let j of nums2) {
            if(CountAB.has(i+j)){
                CountAB.set(i+j,CountAB.get(i+j)+1)
            }else{
                CountAB.set(i+j,1)
            }
                
        }
    }
    let count = 0
     for(let i of nums3){
        for(let j of nums4){
           if(CountAB.has(-i-j)){
               count += CountAB.get(-i-j)
           }
        }
    }
    return count
}

383. 赎金信

注意两个放入map的顺序

var canConstruct = function(ransomNote, magazine) {
    let map = new Map()

    for(let i of magazine){
        map.set(i,(map.get(i)||0)+1)
    }
    for(let i of ransomNote){
        if(map.has(i)&&map.get(i)>0){
            map.set(i,map.get(i)-1)
        }else{
            return false
        }
    }
    return true
};

15. 三数之和

var threeSum = function(nums) {
    const res = [], len = nums.length
    // 将数组排序
    nums.sort((a, b) => a - b)
    for (let i = 0; i < len; i++) {
        let l = i + 1, r = len - 1, iNum = nums[i]
        // 数组排过序,如果第一个数大于0直接返回res
        if (iNum > 0) return res
        // 去重
        if (iNum == nums[i - 1]) continue
        while(l < r) {
            let lNum = nums[l], rNum = nums[r], threeSum = iNum + lNum + rNum
            // 三数之和小于0,则左指针向右移动
            if (threeSum < 0) l++ 
            else if (threeSum > 0) r--
            else {
                res.push([iNum, lNum, rNum])
                // 去重
                while(l < r && nums[l] == nums[l + 1]){
                    l++
                }
                while(l < r && nums[r] == nums[r - 1]) {
                    r--
                }
                l++
                r--
            }
        }
    }
    return res
};

18. 四数之和


var fourSum = function(nums, target) {
    const quadruplets = [];
    if (nums.length < 4) {
        return quadruplets;
    }
    nums.sort((x, y) => x - y);
    const length = nums.length;
    for (let i = 0; i < length - 3; i++) {
        if (i > 0 && nums[i] === nums[i - 1]) {
            continue;
        }
        if (nums[i] + nums[i + 1] + nums[i + 2] + nums[i + 3] > target) {
            break;
        }
        if (nums[i] + nums[length - 3] + nums[length - 2] + nums[length - 1] < target) {
            continue;
        }
        for (let j = i + 1; j < length - 2; j++) {
            if (j > i + 1 && nums[j] === nums[j - 1]) {
                continue;
            }
            if (nums[i] + nums[j] + nums[j + 1] + nums[j + 2] > target) {
                break;
            }
            if (nums[i] + nums[j] + nums[length - 2] + nums[length - 1] < target) {
                continue;
            }
            let left = j + 1, right = length - 1;
            while (left < right) {
                const sum = nums[i] + nums[j] + nums[left] + nums[right];
                if (sum === target) {
                    quadruplets.push([nums[i], nums[j], nums[left], nums[right]]);
                    while (left < right && nums[left] === nums[left + 1]) {
                        left++;
                    }
                    left++;
                    while (left < right && nums[right] === nums[right - 1]) {
                        right--;
                    }
                    right--;
                } else if (sum < target) {
                    left++;
                } else {
                    right--;
                }
            }
        }
    }
    return quadruplets;
};