JavaScript两数之和
Posted 想上天的小鱼
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaScript两数之和相关的知识,希望对你有一定的参考价值。
题目
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
示例 1:
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。示例 2:
输入:nums = [3,2,4], target = 6
输出:[1,2]示例 3:
输入:nums = [3,3], target = 6
输出:[0,1]提示:
2 <= nums.length <= 104
-109 <= nums[i] <= 109
-109 <= target <= 109
只会存在一个有效答案
好了,问题来了,我们需要做什么?
在目标数组中找出两个数字相加等于目标值,返回这两个数字在数组中对应的下标。
解决方案有哪些呢,让我们一起来瞅一瞅:
1、暴力枚举
先来看一个常规操作。
- 时间复杂度 O(N*N)
- 空间复杂度 O(1)
var twoSum = function(nums, target) {
for (let i = 0; i < nums.length; i++) {
// 因为两个数的下标不相等,所以 j=i+1
for (let j = i + 1; j < nums.length; j++) {
if (nums[i] + nums[j] === target && i !== j) {
return [i, j];
}
}
}
};
下面的解法是通过查找差值的下标,和上面的方法大同小异。
可以参考一下。
解法1:
var twoSum = function(nums, target) {
for (let i = 0; i < nums.length; i++) {
let num = target - nums[i];
let j = nums.findIndex((item, index) => item === num && index !== i);
if (j !== -1) {
return [i, j];
}
}
};
解法2:
var twoSum = function(nums, target) {
for (let i = 0; i < nums.length; i++) {
let j = nums.indexOf( target - nums[i]);
if (j !== -1 && i !== j) {
return [i, j];
}
}
};
2、静态哈希
如果对Map的使用方法还不清楚的,可以去这里。
- 时间复杂度 O(N)
- 空间复杂度 O(N)
var twoSum = function(nums, target) {
let map = new Map();
for(let i = 0; i< nums.length; i++) {
// 把数组里面的值都存成Map结构
map.set(nums[i], i);
}
for(let i = 0; i< nums.length; i++) {
// 获取差值
let diff = target - nums[i];
if (map.has(diff) && map.get(diff) !== i) {
return [i, map.get(diff)];
}
}
};
3、动态哈希
和上面一种方法类似,不同点在于,只循环了一次。
- 时间复杂度 O(N)
- 空间复杂度 O(N)
var twoSum = function(nums, target) {
let map = new Map();
for(let i = 0; i < nums.length; i++) {
const num1 = nums[i];
const num2 = target - nums[i];
// 判断map里是否存在num2,如果存在,返回下标;否则,把num1放进map里
if (map.has(num2)) {
return [map.get(num2), i];
} else {
map.set(num1, i);
}
}
};
这里解释一下,为什么返回的是[map.get(num2), i]?(知道的请自行跳过)
以nums=[2,7,8,9],target=9为例:
- i=0, num1=2, num2=7, map里没有num2 (即7), 所以把 (num1, i),也就是(2,0)放进map里
- i=1, num1=7, num2=2, map里有num2(即2),直接返回[0, 1]
看到这里应该就明白了,因为一开始的时候,map里的键值对还没有被放进去,所以后面map里面可以找到的时候,找到的是之前放进去的值,这个顺序也就没有疑问了。(这里也是因为当时我自己没有太明白,才多说了一嘴)
本次的分享先告一段落,如果有什么不正确或者更优的解决方案,欢迎大家评论区交流,一起进步呀!
以上是关于JavaScript两数之和的主要内容,如果未能解决你的问题,请参考以下文章