题目
给你一个下标从 1 开始的整数数组
numbers,该数组已按 ****非递减顺序排列 ** ,请你从数组中找出满足相加之和等于目标数target的两个数。
输入:numbers = [2,7,11,15], target = 9
输出:[1,2]
解释:2 与 7 之和等于目标数 9 。因此 index1 = 1, index2 = 2 。返回 [1, 2] 。
题解
这里采用二分查找的方式进行实现,我们首先定义一个变量n来存储数组numbers的长度,并将变量left初始化为0,然后进入一个循环,判断一下left是否小于n-1,如果是,就继续执行循环,在循环中,定义变量low为left+1,变量high为n-1,表示在数组中查找时的左右边界。然后进入另一个循环,判断一下low是否小于等于high,如果是,就继续执行循环,在这个循环中,定义变量right为low+high的一半(向下取整),表示当前查找区间的中间位置。然后判断数组中下标为left和下标为right的两个数之和是否等于target,如果是,就返回它们的下标,如果它们的和大于target,则将high指向right-1,缩小查找区间的右边界;如果它们的和小于target,则将low指向right+1,缩小查找区间的左边界,当这个内层循环结束时,表示在当前区间内没有找到符合要求的两个数,因此需要将left向右移动一位,然后继续循环查找下一组区间,当整个循环结束时,表示在数组中没有找到符合要求的两个数,因此直接返回空数组
var twoSum = function (numbers, target) {
let n = numbers.length, left = 0
while (left < n - 1) {
let low = left + 1, high = n - 1
while (low <= high) {
let right = Math.floor(low + (high - low) / 2)
if (numbers[left] + numbers[right] === target) {
return [left + 1, right + 1]
} else if (numbers[left] + numbers[right] > target) {
high = right - 1
} else {
low = right + 1
}
}
left++
}
};
坚持努力,无惧未来!