算法训练(三)

54 阅读1分钟

两数之和:哈希表解题

给你一组数字和一个目标值,得在数字里找出俩相加等于目标值的,并报出它们的位置。
示例:
输入: nums1 = [1,2,2,1], nums2 = [2,2]
输出: [2,2]
输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出: [4,9]

function sum(arr, target) {
    let mapArr = new Map();
    for (let i = 0; i < arr.length; i++) {
        let num = target - arr[i];
        if (mapArr.has(num)) {
            return [mapArr.get(num), i];
        }
        mapArr.set(arr[i], i);
    }
    return [];
}

数组交集 II:依旧哈希表

找出两个给定数组的交集,不过这里的交集有特殊要求:输出结果中每个元素出现的次数,要和该元素在两个数组中出现次数的最小值一致。并且不需要考虑输出结果的顺序。

示例:
输入: nums1 = [1, 2, 2, 1], nums2 = [2, 2]
输出: [2, 2]

function intersect(nums1, nums2) {
    const map = new Map();
    for (let num of nums1) {
        if (map.has(num)) {
            map.set(num, map.get(num) + 1);
        } else {
            map.set(num, 1);
        }
    }

    const result = [];
    for (let num of nums2) {
        if (map.has(num) && map.get(num) > 0) {
            result.push(num);
            map.set(num, map.get(num) - 1);
        }
    }

    return result;
}

在上述代码中,我们先把第一个数组中每个元素的出现次数记在哈希表里,然后遍历第二个数组,找到相同元素就把它拉进结果队伍,同时减少 “账本” 里队员的计数。这样就能精准找出交集,是不是很机智?今天先到这吧~