剑指 Offer 57. 和为s的两个数字
解题思路:
算法流程:
- 初始化: 双指针 i , j 分别指向数组 nums的左右两端 (俗称对撞双指针)。
- 循环搜索: 当双指针相遇时跳出;
1)计算和 s = nums[i] + nums[j];
2)若 s > target,则指针 j 向左移动,即执行 j = j - 1;
3)若 s < target ,则指针 i 向右移动,即执行 i = i + 1;
4)若 s = target,立即返回数组 [nums[i], nums[j]]] ; - 返回空数组,代表无和为 target 的数字组合。
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
vector<int> res;
//采用双指针
int i = 0;
int j = nums.size()-1;
while(i < j)
{
if(nums[i] + nums[j] > target)
j--;
else if(nums[i] + nums[j] < target)
i++;
else
{
res.push_back(nums[i]);
res.push_back(nums[j]);
break;
}
}
return res;
}
};