【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为例:
  1. i=0, num1=2, num2=7, map里没有num2 (即7), 所以把 (num1, i),也就是(2,0)放进map里
  2. i=1, num1=7, num2=2, map里有num2(即2),直接返回[0, 1]
看到这里应该就明白了,因为一开始的时候,map里的键值对还没有被放进去,所以后面map里面可以找到的时候,找到的是之前放进去的值,这个顺序也就没有疑问了。(这里也是因为当时我自己没有太明白,才多说了一嘴)
本次的分享先告一段落,如果有什么不正确或者更优的解决方案,欢迎大家评论区交流,一起进步呀!

    推荐阅读