代码随想录训练营Day7|454. 四数相加 II, 383.赎

2023-10-17  本文已影响0人  是小张啊啊

454. 四数相加 II

解题思路
var fourSumCount = function(nums1, nums2, nums3, nums4) {
    let map = new Map();
    for (let i of nums1) {
        for (let j of nums2) {
            map.set(i+j, (map.get(i+j) || 0) + 1)
        }
    }
    let count = 0;
    for (let k of nums3) {
        for (let l of nums4) {
            count += map.get(0 - (k+l)) || 0
        }
    }
    return count;
};

383. 赎金信

解题思路
实现一
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.get(i)) {
            return false;
        }
        map.set(i, map.get(i) - 1)
    }
    return true
};
实现二
var canConstruct = function(ransomNote, magazine) {
    const strArr = new Array(26).fill(0);
    const base = "a".charCodeAt();
    for (let i of magazine) {
        strArr[i.charCodeAt() - base]++;
    }
    for (let i of ransomNote) {
        const index = i.charCodeAt() - base;
        if (!strArr[index]) {
            return false
        }
        strArr[index]--
    }
    return true
};

15. 三数之和

解题思路
难点

目标找出a + b + c = 0,且不可以包含重复的三元组,注意 [0,0,0,0]
a = nums[i], b = nums[left], c = nums[right]

var threeSum = function(nums) {
    if (nums.length < 3) {
        return []
    }
    let arr = nums.sort((a, b) => a - b)
    let left = 0;
    let right = arr.length - 1;
    let res = []
    for(let i = 0;i<arr.length;i++){
        // 如果排序后的第1个元素大于0,那么不可能凑成满足条件的三元组
        if(arr[i]>0) {
            return res
        }
        // 错误去重a方法,将会漏掉-1,-1,2 这种情况
        /*
            if (nums[i] == nums[i + 1]) {
                continue;
            }
        */
        if(i>0 && arr[i]==arr[i-1]) {
            continue
        }
        left = i+1
        right = arr.length - 1
        while(left < right) {
            if (arr[left]+arr[right] +arr[i] < 0){
                left++
            } else if(arr[left]+arr[right] +arr[i] > 0){
                right--
            } else {
                // 优先保存一组满足条件的元组
                res.push([arr[i],arr[left],arr[right]])
                // 去重逻辑应该放在找到一个三元组之后,对b 和 c去重
                while(left < right && arr[left] === arr[left+1]) {
                    left++
                }
                while(left < right && arr[right] === arr[right-1]) {
                    right--
                }
                left++
                right--
            }
        }
    }
    return res;
};

18. 四数之和

解题思路
var fourSum = function(nums, target) {
    let arr = nums.sort((a, b) => a - b);
    let res = [];
    let left = 0;
    let right = arr.length - 1;
    for (let i = 0; i < arr.length; i++) {
        if(arr[i]>target && (arr[i] >= 0 || target >= 0)) { // 一层剪枝
            break
        }
        if (arr[i] === arr[i-1] && i > 0) { // 一层去重
            continue
        }
        for (let j = i+1; j<arr.length; j++) {
            if(arr[i] + arr[j] >target && arr[i] + arr[j] > 0) { // 二层剪枝
                break
            }
            if (arr[j] === arr[j-1] && j > i+1) { 二层去重
                continue
            }
            left = j+1
            right = arr.length - 1
            while(left < right) {
                if (arr[left]+arr[right] +arr[i] + arr[j] < target){
                    left++
                } else if(arr[left]+arr[right] +arr[i] + arr[j] > target){
                    right--
                } else {
                    res.push([arr[i],arr[j],arr[left],arr[right]])
                    while(left < right && arr[left] === arr[left+1]) {
                        left++
                    }
                    while(left < right && arr[right] === arr[right-1]) {
                        right--
                    }
                    left++
                    right--
                }
            }
        }
    }
    return res;
};
上一篇下一篇

猜你喜欢

热点阅读