一、题目描述
给定一个整数数组 nums
和一个整数目标值 target
,请你在该数组中找出 和为目标值 target
的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
二、解题思路
1.暴力求解,循环数组,求每两个数的和。时间复杂度为O(n2)。
2.使用map结构映射。将值作为key存入map,如果和为 target
,当前值为 n ,则另一个数为 target
- n ,此时只需判断 target
- n 是否在 map中,如果在,说明两数相加为 target
,如果不在,则将 n 添加进去作为待匹配值,继续遍历后面的数。
3.如果是有序数组,则可以使用双指针解法。数组首尾各一个指针,计算当前和并与 target
比较,如果小于target
,则说明需要增大,L++;如果大于target
,则说明需要减小,R--。
三、解题代码
两数之和示例:
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var twoSum = function(nums, target) {
let myMap = new Map()
for(let i = 0;i<nums.length;i++){
//如果差可以在已有的map中找到,则说明两者之和等于 target,返回对应的索引
if(myMap.has(target - nums[i])){
return [myMap.get(target - nums[i]),i]
}else{
//否则将值作为key,索引作为value存入
myMap.set(nums[i],i)
}
}
};
代码解析:寻找两数之和,将同时找两个数转化成,确定一个数,然后去匹配另一个数。而map这种结构恰好可以快速实现匹配。
有序数组示例:
/**
* @param {number[]} numbers
* @param {number} target
* @return {number[]}
*/
var twoSum = function(numbers, target) {
let n = numbers.length
let start = 0
let end = n-1
while(start < end){
if(numbers[start] + numbers[end] === target){
return [start+1,end+1]
}else if(numbers[start] + numbers[end] > target){
end--
}else{
start++
}
}
return [start+1,end+1]
};
代码解析:因为是有序数组,左右指针动态调整大小,直至寻找到目标数组(目标数值存在的前提下)。
相关题目: