题目
https://leetcode.cn/problems/he-wei-sde-liang-ge-shu-zi-lcof/submissions/660817798/
思路
解法1是暴力解法,从第一个开始和后面的相加
暴力枚举慢就慢在,这个递增数组是排序好的数组,已经是有序的,暴力解法没有利用这个有序的特性
解法2就是利用数组有序的特性,数组有序可以想到1.二分算法,2.利用单调性,使用双指针算法解决问题
sum与t无非就是三种情况
对于情况①来说,如果此时left已经最小了,但是还是left + right > t,那就说明right - left这个区间的都大于t,left就没必要跟中间那一坨的数相加了,所以直接跳过了,也就是right--
对于情况②来说,如果此时right已经最大了,但是还是left + right < t,那就说明right - left这个区间的都小于t,left就没必要跟中间那一坨的数相加了,所以直接跳过,也就是直接让left++,相比于前面的暴力解法,只需要让left相加一次就能舍去这个数,之前需要相加left-right次才能舍去一个数
对于情况③,当sum == t了就直接返回结果就行了
读者可能出现的错误写法
class Solution {
public:vector<int> twoSum(vector<int>& price, int target) {int n =price.size();int left = 0;int right = n-1;int sum = 0;while(left < right){sum =left + right;if(sum < target){left++;}else if(sum > target){right--;}else{return {price[left],price[right]};}}}
};
这里应该计算的是数组里的值,而不是计算的下标
正确写法
class Solution {
public:vector<int> twoSum(vector<int>& price, int target) {int n =price.size();int left = 0;int right = n-1;int sum = 0;while(price[left] <price[right]){sum =price[left] + price[right];if(sum < target){left++;}else if(sum > target){right--;}else{return {price[left],price[right]};}}return {-1,-1};}
};