简单
两数之和 II - 输入有序数组
数组双指针哈希表
相关算法文章:
题目描述
给定一个升序整数数组和目标值,要求在 O(n) 时间复杂度内找到两个下标,使得它们对应的数字和为目标值。题目保证每组输入都存在唯一解。
解题思路
使用双指针从两端向中间收缩。因为数组有序,若当前和大于目标值,则右指针左移;若当前和小于目标值,则左指针右移。这个思路比暴力枚举更高效。
边界情况
需要注意数组长度为 1、重复数字、以及目标值刚好等于首尾元素的情况。
示例输入/输出
输入: numbers = [2,7,11,15], target = 9
输出: [1, 2]
代码示例
function twoSum(numbers, target) {
let left = 0;
let right = numbers.length - 1;
while (left < right) {
const sum = numbers[left] + numbers[right];
if (sum === target) return [left + 1, right + 1];
if (sum < target) left += 1;
else right -= 1;
}
}
class Solution {
public int[] twoSum(int[] numbers, int target) {
int left = 0, right = numbers.length - 1;
while (left < right) {
int sum = numbers[left] + numbers[right];
if (sum == target) return new int[]{left + 1, right + 1};
if (sum < target) left++;
else right--;
}
return new int[]{};
}
}
class Solution {
public:
vector<int> twoSum(vector<int>& numbers, int target) {
int left = 0, right = numbers.size() - 1;
while (left < right) {
int sum = numbers[left] + numbers[right];
if (sum == target) return {left + 1, right + 1};
if (sum < target) ++left;
else --right;
}
return {};
}
};
def two_sum(numbers, target):
left, right = 0, len(numbers) - 1
while left < right:
total = numbers[left] + numbers[right]
if total == target:
return [left + 1, right + 1]
if total < target:
left += 1
else:
right -= 1
示例输入 / 输出
下面给出一组输入输出示例,便于对照题意与结果。
编号 two-sum-ii难度 简单
输入
numbers = [2,7,11,15], target = 9
输出
[1, 2]