双指针_和为s的两个数_C++
1.题目解析
题目链接:https://leetcode.cn/problems/he-wei-sde-liang-ge-shu-zi-lcof/
题目要求,输出一个可能的结果即可。这个结果以数组的形式输出,元素的顺序无所谓。
2.算法原理
2.1解法一:暴力枚举
以[2, 7, 11, 15, 19, 21]
为例,依次让2+7,2+11,2+15,…,然后让7+11,7+15,7+19,…依次类推,总能找到可能的结果。
用来两层for循环就可以实现。
伪代码:
for(i = 0; i < n; i++)
for(j = i + 1; j < n; j++)
check(nums[i] + nums[j] == t)
为什么暴力方法这么慢?因为它没有利用题中数组的一个特性,数组是有序的。
2.2解法二:利用单调性,使用双指针算法解决
先弄两个指针:(目标值是30)
如图,2和21相加为23,小于30,那么2和21中间的那一堆数还有必要和2相加吗?答案是没有必要,因为数组是单调递增的,所以2和中间那一堆数相加结果一定小于目标值30。
由此,我们可以发现规律:令sum = nums[left] + nums[right]
1)sum > t
:令right--
2)sum < t
:令left++
3)sum = t
:找到了结果
3.代码演示
class Solution {
public:
vector<int> twoSum(vector<int>& price, int target)
{
int n = price.size();
int left = 0;
int right = n - 1;
while(left < right)
{
if(price[left] + price[right] > target)
right--;
else if(price[left] + price[right] < target)
left++;
else return {price[left], price[right]};
}
// 配合编译器
return{-1, -1};
}
};
注意:虽然我们知道这道题如果不写return{-1, -1}
也是一定会有返回结果的,但是编译器不这么认为。它觉得如果你的if
条件不成立,那么这个函数是永远没有返回值结果的,所以我们在该函数的最后再随便返回点什么东西就行了,当然这句代码也是没有执行的机会的。这是leedcode
的特色。