力扣算法JS LC [1. 两数之和] LC [454. 四数相加 II]

LC 1. 两数之和

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

你可以按任意顺序返回答案。

示例 1:

输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。

示例 2:

输入:nums = [3,3], target = 6
输出:[0,1]

解题思路:创建哈希表,在遍历将值写入之前先判断表内是否存在 值等于目标值减去当前值。有直接返回,没有就写入哈希表中。

代码:

var twoSum = function(nums, target) {
    const map =  new Map(); //创建哈希表
    for(let i =0; i < nums.length; i++) {
        if(map.has(target - nums[i])) { //判断哈希表中有没有等于 目标值 减去 当前值 的值
            return [map.get(target - nums[i]), i];
        } else {
            map.set(nums[i], i) //没有就将当前值写入哈希表
        }
    }
    return []
};

LC 454. 四数相加 II

给你四个整数数组 nums1、nums2、nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足:

0 <= i, j, k, l < n nums1[i] + nums2[j] + nums3[k] + nums4[l] == 0

示例 1:

输入:nums1 = [1,2], nums2 = [-2,-1], nums3 = [-1,2], nums4 = [0,2]
输出:2
解释:
两个元组如下:
​
1. (0, 0, 0, 1) -> nums1[0] + nums2[0] + nums3[0] + nums4[1] = 1 + (-2) + (-1) + 2 = 0
2. (1, 1, 0, 0) -> nums1[1] + nums2[1] + nums3[0] + nums4[0] = 2 + (-1) + (-1) + 0 = 0

示例 2:

输入:nums1 = [0], nums2 = [0], nums3 = [0], nums4 = [0]
输出:1

解题思路:将四组数组分为两组,从前两组各取一个值存进哈希表,直到全部存入。遍历后两个数组,各取一值,判断哈希表内是否有这两个值的和的相反数

代码:

var fourSumCount = function(nums1, nums2, nums3, nums4) {
    const map = new Map();
    // 在 nums1和 nums2 数组中各选一个数相加,和作为键,出现的次数作为值
    nums1.forEach(a => nums2.forEach( b => map.set((a + b), (map.get(a + b) || 0) + 1)));
    let n = 0; //初始化元组个数
    for(let i of nums3) {
        for(let j of nums4) {
            if(map.has(-i - j)) { //循环 nums3、 nums4,各取其中一个值,判断哈希表中是否存在他的相反数
                n += map.get(-i - j); 
            }
        }
    }
    return n;
};

你可能感兴趣的:(哈希表,算法,leetcode,哈希表)