167. Two Sum II - Input array is sorted
这是leetCode第167题
题目
Given an array of integers that is already sorted in ascending order, find two numbers such that they add up to a specific target number.
The function twoSum should return indices of the two numbers such that they add up to the target, where index1 must be less than index2. Please note that your returned answers (both index1 and index2) are not zero-based.
You may assume that each input would have exactly one solution and you may not use the same element twice.
Input: numbers={2, 7, 11, 15}, target=9
Output: index1=1, index2=2
意思是说:
给你一个已经按照升序排序的整数数组,找出两个数字,它们相加的和等于一个特定的目标数字。
函数twoSum应该返回这两个数字的索引,且index1必须小于index2。请注意,你的答案中的索引不是基于0开始的。
您可以假设每个输入都将具有一个解决方案,您可能不会使用相同的元素两次。
对于数组[2,7,11,15],目标数字9
应该输出: index1=1,index2=2;
思路
给我们的数组是按升序排列的,那么我们可以这么做:
1.将数组两端的数字(数组索引分别为0,length-1)相加,与目标数字比较
2.如果和大于目标数字,就将数组索引大的减少1(和就变小了)。
3.如果和小于目标数字,就将数组索引小的加+1(和就变大了)。
4.直到和等于目标数字,输出此时数组的索引,记得都加1,或者直到索引大的等于索引小的,就输出[-1,-1]
代码如下:
/**
* @param {number[]} numbers
* @param {number} target
* @return {number[]}
*/
var twoSum = function(numbers, target) {
var low = 0, high = numbers.length - 1;
var sum = 0;
while (low < high) {
sum = numbers[low] + numbers[high];
if (sum > target) {
high--;
} else if (sum < target) {
low++;
} else {
return [low + 1, high + 1];
}
}
return [-1, -1];
};