【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
只会存在一个有效答案
在目标数组中找出两个数字相加等于目标值,返回这两个数字在数组中对应的下标。
【【JavaScript】两数之和】解决方案有哪些呢,让我们一起来瞅一瞅:
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]
本次的分享先告一段落,如果有什么不正确或者更优的解决方案,欢迎大家评论区交流,一起进步呀!
推荐阅读
- 宽容谁
- 我要做大厨
- 增长黑客的海盗法则
- 画画吗()
- 2019-02-13——今天谈梦想()
- 远去的风筝
- 三十年后的广场舞大爷
- 叙述作文
- 20190302|20190302 复盘翻盘
- 学无止境,人生还很长