菜鸡刷算法的一天,每天分享两题算法,大家有这个想法的,可以给我个关注,然后一起坚持每天的算法之旅。希望我们共同进步,一起加油。 LC 1. 两数之和 给定一个整数数组 nums 和
给定一个整数数组 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
给你四个整数数组 nums1、nums2、nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足:
示例 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;
};