两数之和II-输入有序数组
hello 大家好!今天开写一个新章节,每一天一道算法题。让我们一起来学习算法思维吧!
function twoSum(numbers, target) {
// 初始化左右指针,左指针指向数组第一个元素(索引为 0)
let left = 0;
// 右指针指向数组最后一个元素
let right = numbers.length - 1;
// 开始双指针遍历,只要左指针小于右指针就继续循环
while (left < right) {
// 计算当前左右指针所指元素的和
const currentSum = numbers[left] + numbers[right];
// 如果当前和等于目标值
if (currentSum === target) {
// 因为题目要求下标从 1 开始,所以将索引加 1 后返回
return [left + 1, right + 1];
}
// 如果当前和小于目标值,说明需要增大和,将左指针右移一位
else if (currentSum < target) {
left++;
}
// 如果当前和大于目标值,说明需要减小和,将右指针左移一位
else {
right--;
}
}
// 理论上不会执行到这里,因为题目保证有唯一解
return [];
}
// 测试示例
const numbers = [2, 7, 11, 15];
const target = 9;
console.log(twoSum(numbers, target));
代码解释
整体思路
本题使用双指针法来解决,因为数组是按非递减顺序排列的。我们设置两个指针,一个在数组开头(左指针),一个在数组末尾(右指针)。通过计算两个指针所指元素的和,并与目标值比较,根据比较结果移动指针,逐步缩小查找范围,直到找到满足条件的两个元素。
代码步骤分析
初始化指针:
- left 指针初始化为 0,表示数组的第一个元素。
- right 指针初始化为 numbers.length - 1,表示数组的最后一个元素。
双指针遍历:
- 使用 while 循环,只要 left 小于 right 就继续循环。
- 在每次循环中,计算 numbers[left] 和 numbers[right] 的和 currentSum。
- 如果 currentSum 等于 target,说明找到了满足条件的两个元素,将它们的下标(加 1 以符合题目要求从 1
开始)作为数组返回。 - 如果 currentSum 小于 target,说明当前和太小,需要增大和,将 left 指针右移一位。
- 如果 currentSum 大于 target,说明当前和太大,需要减小和,将 right 指针左移一位。
返回结果:
- 由于题目保证有唯一解,所以在找到满足条件的元素后会返回结果,理论上不会执行到返回空数组这一步。