算法讲解--查找总价值为目标值的两个商品
一,题目描述
题目中的意思也就是说给你一个值和一个数组。这一个值能不能拆分为一个数组中已有的两个数。注意:题目中给的数组为升序数组。
二,算法讲解
1,暴力求解:
通过两层次循环将数组中每一种情况都和target比较。是否等于target。若等于则返回对应的值。不等于返回空数组。时间复杂度为O(N^2)。若题目中对于时间复杂度要求很高,则会因为超时导致该题目无法通过。
vector<int> twoSum(vector<int>& price, int target) {vector<int> s(0,2);for(int i = 0 ; i < price.size();i++){for(int j = i+1; j < price.size();j++){if(price[i] + price[j] == target){s.push_back(price[i]);s.push_back(price[j]);return s;}}}return s;}
会出现超时错误。
2,双指针法:
在题目的介绍中明显提到给出的数组并不普通数组,而是升序数组。由此定义两个指针。left指向最左边,也就是最小数据;right指向最右边,也就是最大数据。如题目中第二组例子如图:
第一步:
目标值为61 。left + right = 74 > 61 。 此时left向右所有的值都大于74也就是说都大于61 。因此right减减。如图:
第二步:
left + right = 60 < 61 。此时right向左的所有值都小于60也就是说都小于61 .。因此 left++。如图:
第三步;
left + right = 73 > 61。情况和第一步相同,执行第一步操作。如图:
第四步:
left + right = 55 < 61 。情况和第二步相同,执行第二步操作。如图:
第五步:
left + right =61 == target 。将这两值存入vector数组进行返回。得出结果。如left > right 则表明该数组中没有满足题目中的数值。返回空数组。
该方法仅仅对数据遍历了一边,因此时间复杂度为O(N).。
三,代码实现
vector<int> twoSum(vector<int>& price, int target) {vector<int> s(0,2);int left = 0;int right = price.size()-1;while(left < right){if(price[left] + price[right] == target){s.push_back(price[left]);s.push_back(price[right]);return s;}if(price[left] + price[right] > target){right--;}if(price[left] + price[right] < target){left++;}}return s;}
题目中的push_back对数据进行尾部插入。具体可以参考vector的讲解文章。C++--vector_c++ vector assign-CSDN博客
四,练习
LCR 179. 查找总价格为目标值的两个商品 - 力扣(LeetCode)