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; };