[两数之和II]
代码思路分析
使用 双指针法 在有序数组 numbers
中寻找两个数,使它们的和等于 target
。
1. 初始化
int l = 0, r = n - 1; // 双指针:l 指向头,r 指向尾
vector<int> res; // 存储结果
- 指针含义:
l
(左指针):从数组头部开始向右移动。r
(右指针):从数组尾部开始向左移动。
2. 双指针遍历
while (l < r) {if (numbers[l] + numbers[r] < target) {l++; // 和太小,左指针右移} else if (numbers[l] + numbers[r] > target) {r--; // 和太大,右指针左移} else {res.push_back(l + 1); // 找到解,记录索引(从1开始)res.push_back(r + 1);return res; // 立即返回结果}
}
- 移动逻辑:
- 和太小:
numbers[l] + numbers[r] < target
→ 左指针l++
(增大和)。 - 和太大:
numbers[l] + numbers[r] > target
→ 右指针r--
(减小和)。 - 匹配成功:
numbers[l] + numbers[r] == target
→ 返回索引[l+1, r+1]
。
- 和太小:
3. 返回结果
- 找到解:直接返回
res
(包含两个索引)。 - 无解:题目保证解存在,实际不会执行到
return res
(但代码保持完整性)。
关键点
- 有序数组的利用:
- 数组已排序,因此可以通过双指针的移动方向 智能调整和的大小。
- 双指针的正确性:
- 每次移动指针都能排除一部分不可能的解,确保不会漏解。
- 索引处理:
- 题目要求返回 从 1 开始的索引,因此结果需要
+1
。
- 题目要求返回 从 1 开始的索引,因此结果需要
class Solution {
public:vector<int> twoSum(vector<int>& numbers, int target) {int n=numbers.size();int l=0,r=n-1;vector<int> res;while(l<r){if(numbers[l]+numbers[r]<target){l++;}else if(numbers[l]+numbers[r]>target){r--;}else{res.push_back(l+1);res.push_back(r+1);return res;}}return res;}
};