从今天开始学习算法每日一题,总结该算法的各种实现方法,本人前端小白,只总结js的代码实现,并附上思路便于复习。题目的答案都从力扣网里的大神那找到,自己暂时还想不出来怎么写,希望以后会有所进步。
*给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标(js实现)。
1.方法1
利用哈希表将每一个整数与target目标数的差值和该证书的索引值,以键值对(差值,索引值)的方式存入哈希表,循环判断每一个整数在哈希表中是否存在与该整数相等的差值,若不存在将该整数对应的差值以及对应的索引值存入哈希表,若存在即说明在之前的循环遍历中已经出现了与当前循环整数相加等于target的整数,这就已经找到了和为目标值的两个整数。
说直白点就是将数组中整数的差值一个一个放入哈希表,当出现了当前整数等于之前循环遍历的整数差值的情况,就说明这两个数已经找到了。当前整数 = 之前整数的差值 , 之前整数的差值 = target - 之前的整数 ,当前整数 + 之前的整数 = target
以下是代码
const twoSum = (nums, target) => {
// 1. 构造哈希表
const map = new Map(); // 存储方式 {need, index}
// 2. 遍历数组
for (let i = 0; i < nums.length; i++) {
// 2.1 如果找到 target - nums[i] 的值
if (map.has(nums[i])) {
return [map.get(nums[i]), i];
} else {
// 2.2 如果没找到则进行设置
map.set(target - nums[i], i);
}
}
};
console.log(twoSum([3,2,5,7], 9)); // [0, 1]
2 方法2 暴力双循环法 自己写出来了 但是不推荐使用 时间复杂度高 你懂的 新手就这样只能写这种垃圾东西 关键点就是第二层循环从哪开始吧 思路就是当前这个整数与之后的所有的数依次进行判断即相加是否等于target 而且比较过的最好不要再次比较 还要排除判断自身相加的情况
以下是代码
var twoSum = function(nums, target) {
let arr = nums;
let arrs = new Array()
for(let i = 0; i < arr.length - 1; i++){
for(let j = i + 1; j < arr.length; j++){
if ( arr[i] + arr[j] === target) {
arrs.push(i, j)
return arrs
}
}
}
}
console.log(twoSum([11,11,42,5,3,5],10))
关键点就是第二层循环从 j = i+1 开始