題目描述:
給定一個(gè)整數(shù)數(shù)組 nums 和一個(gè)整數(shù)目標(biāo)值 target ,請(qǐng)你在該數(shù)組中找出 和為目標(biāo)值 target 的那 兩個(gè) 整數(shù),并返回它們的數(shù)組下標(biāo)。
你可以假設(shè)每種輸入只會(huì)對(duì)應(yīng)一個(gè)答案。但是,數(shù)組中同一個(gè)元素在答案里不能重復(fù)出現(xiàn)。
你可以按任意順序返回答案。示例1:
輸入:nums = [2,7,11,15], target = 9
輸出:[0,1]
解釋?zhuān)?/strong>因?yàn)?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 <= 10^4
- -10^9 <= nums[i] <= 10^9
- -10^9 <= target<= 10^9
- 只會(huì)存在一個(gè)有效答案
進(jìn)階:你可以想出一個(gè)時(shí)間復(fù)雜度小于 O(n^2) 的算法嗎?
來(lái)源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/two-sum
解法一(兩層嵌套循環(huán))
思路:
做嵌套循環(huán)(但通過(guò)執(zhí)行結(jié)果可以看到用時(shí)較久,后面會(huì)用哈希映射解法來(lái)做)
代碼:
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var twoSum = function(nums, target) {
var i,j;
for(i=0;i<nums.length-1;i++){
for(j=i+1;j<nums.length;j++){
if(nums[i]+nums[j]==target){
return [i,j];
}
}
}
};
執(zhí)行結(jié)果:

image.png
解法2(哈希映射解法)
思路:
通過(guò)創(chuàng)建Hash表,以map.has() / map.get()來(lái)快速找值
代碼:
var twoSum = function(nums, target) {
let map = new Map();//創(chuàng)建Map
let len = nums.length;
for(let i = 0;i < len;i++){
let key = target - nums[i];
if(map.has(key)){//判斷是否存在key值,符合的便返回對(duì)應(yīng)下標(biāo)
return [map.get(key),i];
}
map.set(nums[i],i);//不符合的就存入hash表
}
};
執(zhí)行結(jié)果:

image.png