给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
解法一:for双重循环
var twoSum = function(nums, target) {
var arr = [];
for (var i = 0; i < nums.length-1; i++){
let a = target - nums[i];
for (var j = i+1; j < nums.length; j++){
if(a === nums[j]){
arr.push(i);
arr.push(j);
return arr
}
}
}
return false
};
解法二:map + indexOf方法
var twoSum = function (nums, target) {
let arr = []
nums.map( (item,index) => {
if(nums.indexOf(target - item) > -1 && nums.indexOf(target - item) != index){
arr = [index,nums.indexOf(target - item)].sort((a,b)=> a-b)
}
})
return arr
}
map遍历数组,item是数组中的每一项,index是下标值
indexOf返回元素在数组中第一次出现的位置
sort对要返回的数组排序
解法三:双指针法
着如果方法有点类似二分法查找,只不过不需要设置中间值。因为数组是排好序的,所有可以用双指针查找,前后各一个指针开始走,如果两数之和大于target,就让后面的指针向前走,这样值会小一些,如果两数之和小于target,就让前边的指针向后走,这样值会越来越大
var twoSum = function(numbers, target) {
let result = []
let left = 0
let right = numbers.length -1
while(left < right) {
if(numbers[left] + numbers[right] === target) {
result.push(left+1)
result.push(right+1)
break
}else if(numbers[left] + numbers[right] > target) {
right--
}else {
left++
}
}
return result
};
解法三的性能相对比前两个要好一些