题目简述
给定一个已按照 非递减顺序排列 的整数数组 numbers ,请你从数组中找出两个数满足相加之和等于目标数 target 。
函数应该以长度为 2 的整数数组的形式返回这两个数的下标值。numbers 的下标 从 1 开始计数 ,所以答案数组应当满足 1 <= answer[0] < answer[1] <= numbers.length 。
你可以假设每个输入 只对应唯一的答案 ,而且你 不可以 重复使用相同的元素。
简单
双指针
/**
* @param {number[]} numbers
* @param {number} target
* @return {number[]}
*/
var twoSum = function(numbers, target) {
let startIndex = 0;
let endIndex = numbers.length - 1
while (startIndex < endIndex) {
if (numbers[startIndex] + numbers[endIndex] > target) {
endIndex --
} else if (numbers[startIndex] + numbers[endIndex] < target) {
startIndex ++
} else {
return [startIndex + 1, endIndex + 1]
}
}
};
- 问题分析
- 因为
numbers
是递增的,所以我们将两个数从首尾开始向中间收拢,每次去比较两个值之和与target
,如果和更大则将右值向左收拢,反之左值向右。
- 因为