1. 两数之和 II - 输入有序数组解析
1.1 问题理解与核心思路
这道题目要求我们在一个已经排序的整数数组中,找到两个数使它们的和等于目标值。与经典的两数之和问题不同之处在于:
- 数组已经按非递减顺序排列
- 下标从1开始计数
- 题目保证有且仅有一个解
- 要求使用常量级额外空间
基于数组已排序的特性,双指针法是最优选择。其核心思想是:
- 初始化两个指针:left指向数组起始位置(0),right指向数组末尾(len-1)
- 计算当前两数之和:
- 如果等于target,直接返回结果
- 如果大于target,右指针左移(减小总和)
- 如果小于target,左指针右移(增大总和)
这种方法的优势在于时间复杂度为O(n),空间复杂度为O(1),完全符合题目要求。
1.2 代码实现与优化
原始代码虽然正确,但存在几个可以优化的点:
cpp复制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}; // 直接构造返回,避免临时变量
} else if (sum > target) {
right--; // 和太大,右指针左移
} else {
left++; // 和太小,左指针右移
}
}
return {}; // 题目保证有解,这里仅为语法需要
}
};
优化点说明:
- 找到解后立即返回,避免不必要的后续计算
- 合并重复的sum计算,减少运算次数
- 使用列表初
