两数之和
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
nums = [1,2,3] target = 4 return[0,2]
这是一个非常简单的题,前端面试经常会考,但是考的点并不是你能不能解出这个题,一般的思路就是先取一个数,然后遍历剩余的数,如果有个数和上一次取的数相加,结果等于target,就把下标返回,直接上代码。
const twoSum = function (nums, target) {
const n = nums.length;
for (let i = 0; i < n; i++) {
for (let j = 0; j < n; j++) {
if (j === i) continue;
if (nums[i] + nums[j] === target) return [i, j];
}
}
思路2: 目标值是由两个值相加得来的,所以这两个数是互补的,所以我们只要把target-当前值的结果作为map的key,把当前值的下标作为value存到map里面之后只需检查map的key就行,如果没有这个值就存进去,如果有,就把这个key对应的值取出来,再加上当前值的下标,就是我们要的结果。
const twoSum2 = function (nums, target) {
const n = nums.length;
const map = new Map();
for (let i = 0; i < n; i++) {
if (map.has(nums[i])) {
return [map.get(nums[i]), i];
}
map.set(target - nums[i], i);
}
};
是不是非常的简单,这个题会让你深刻的体验到为什么叫数据结构与算法,为什么不单独叫算法,像map这种映射结构天生就适合做这种事,还有set这种非常适合去重,能把时间复杂度直接从O(n^2)降到O(n),提升非常的大。
评论区