题目
给你一个下标从 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++ } };