代码随想录Day7打卡 哈希表(2)

41 阅读2分钟

454 四数相加-2

我们可以先把num1和num2的所有可能的和加到哈希表中,然后在遍历num3和num4,把所有可能和计算出来,并检查哈希表中是否有(0-sum),如果有的话就把哈希表的值加到结果中

var fourSumCount = function(nums1, nums2, nums3, nums4) {
    const map = new Map()
    let res = 0
    for (const n of nums1) {
        for (const n2 of nums2) {
            const sum = n + n2
            if (!map.has(sum)) {
                map.set(sum, 0)
            }
            map.set(sum, map.get(sum) + 1)
        }
    }

    for (const n of nums3) {
        for (const n2 of nums4) {
            const sum = n + n2
            if (map.has(0 - sum)) {
                res += map.get(0 - sum)
            }
        }
    }
    return res
};

383 赎金信

我们可以用一个哈希表来把magzine中的char存在哈希表中,然后遍历ransomnote来查看是否有匹配的字符

var canConstruct = function(ransomNote, magazine) {
    const map = new Map()
    for (const c of magazine) {
        if (!map.has(c)) {
            map.set(c, 0)
        }
        map.set(c, map.get(c) + 1)
    }
    for (const c of ransomNote) {
        if (!map.has(c)) {
            return false
        } else {
            map.set(c, map.get(c) - 1)
            if (map.get(c) === 0) {
                map.delete(c)
            }
        }
    }
    return true
};

15 三数之和

用双指针操作。因为涉及到去重,并且由于题目中没有要求答案固定顺序,所以我们可以先把nums数组排序。遍历排序后的数组,去重并剪枝。固定一个数组之和,用双指针的技巧来确定第二和第三个数字。

var threeSum = function(nums) {
    let res = []
    if (!nums || nums.length < 3) {
        return res
    }
    nums.sort((a, b) => a - b)
    for (let i = 0; i < nums.length; i++) {
        if (nums[i] > 0) {
            break
        }
        if (i > 0 && nums[i] === nums[i-1]) {
            continue
        }
        let left = i + 1, right = nums.length - 1
        while (left < right) {
            const sum = nums[i] + nums[left] + nums[right]
            if (sum === 0) {
                res.push([nums[i], nums[left], nums[right]])
                // 需要注意的是:把一个合理的结果放入结果数组之后,我们要对重复的去重。
                while (left < right && nums[left] === nums[left+1]) {
                    left += 1
                }
                left += 1
                while (left < right && nums[right] === nums[right-1]) {
                    right -= 1
                }
                right -= 1
            } else if (sum > 0) {
                right -= 1
            } else {
                left += 1
            }
        }
    }
    return res
};

18 四数之和

var fourSum = function(nums, target) {
    const res = []
    nums.sort((a, b) => a - b)
    for (let i = 0; i < nums.length - 3; i++) {
        if (i > 0 && nums[i] === nums[i-1]) {
            continue
        }
        for (let j = i + 1; j < nums.length; j++) {
            if (j > i + 1 && nums[j] === nums[j-1] ) {
                continue
            }
            
            let left = j + 1, right = nums.length - 1
            while (left < right) {
                
                if ((nums[left] + nums[right] + nums[i] + nums[j]) > target) {
                    right -= 1
                } else if ((nums[left] + nums[right] + nums[i] + nums[j]) < target) {
                    left += 1
                } else {
                    res.push([nums[i], nums[j], nums[left], nums[right]]) 
                    while (left < right && nums[left] === nums[left + 1]) {
                        left += 1
                    }
                    left += 1
                    while (left < right && nums[right] === nums[right - 1]) {
                        right -= 1
                    }
                    
                    right -= 1
                }
            }
        }
        
    }
    return res
};