Hello,大家好,我是disguiseFish,我已经摆烂很长一段时间啦,摆烂的日子过得快乐又飞快~不知不觉都一年多了!!
最近在卷算法,但其实我的逻辑思维能力偏弱以及我之前就没有刷过算法!!所以我决定,每天写一点算法提升自己的逻辑思维!接下来我会从简入深的顺序来卷算法,同时会把看过的算法记录在这个平台~ 共勉!!!
1.两数之和
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
方法1
利用对象和“key in obj”快速判断是否存在来实现
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var twoSum = function (nums, target) {
var obj = {}
let res
// 新建一个对象 把数组的值作为对象的键,序列号作为对象的值(为了用key in obj快速判断是否存在来实现)
nums.forEach((item, index) => {
obj[item] = index
})
nums.forEach((item, index) => {
// 目标值 - 循环当前项 得到的值在这个数组中以及这两个的序列号不一样的话
if ((target-item) in obj && index !== obj[target-item]) {
res = [index, obj[target-item]]
}
})
return res
};
方法2
利用map和数组循环比对,相当于有两个篮子,一个空篮子,一个初始篮子
var twoSum = function(nums, target) {
var len = nums.length;
// 如果长度不足2 直接返回空数组
if(len < 2) return []
// 创建一个map
var map = new Map();
for (var i=0; i<len; i++) {
var num = nums[i];
var diff = target - num;
// 判断一个Map对象中是否含有指定 键 的diff
// 有的话说明当前累加起来是tartget值则可以返回
if(map.has(diff)) {
return [map.get(diff), i]
}
map.set(num, i);
}
return []
}