当前位置: 首页 > news >正文

C++ 优先算法 —— 查找总价格为目标值的两个商品(双指针)

目录

题目 :查找总价格为目标值的两个商品

1. 题目解析

2. 算法原理

Ⅰ 暴力枚举

Ⅱ 双指针算法

3. 代码实现

 暴力枚举

 双指针算法


题目 :查找总价格为目标值的两个商品

1. 题目解析

题目截图:

这道题的一个关键的地方,它先说明了这是一个升序的数组,对于后面要解释的双指针的算法是重要的。

2. 算法原理

这道题有两种解法:

Ⅰ 暴力枚举

先固定一个数,然后找第二个数与它匹配,但是这个会超时,图示将在后面展示。 

//伪代码演示
for(int i=0;i<n;i++)for(int j=i+1;j<n;j++)检查price[i]+price[j]的值是否等于target 

这样来看,这个时间复杂度是O(N²)。

Ⅱ 双指针算法

利用单调性,使用双指针算法解决问题。

sum对应会有三种情况:

  1. sum>t
  2. sum<t
  3. sum==t  

我们可以利用单调性来减少判断次数 ,分析如下:

 

所以上述left固定2,right向内枚举的情况可以直接不用考虑了,直接让left向后移动一位(left++)

接下来,继续判断sum的情况 

移动后继续判断: 

 

 所以上述right固定21,left向内枚举的情况可以直接不用考虑了,直接让right向前移动一位,(right--)。

移动后再判断:

所以:

  1. sum>t     ---->   right--即可
  2. sum<t     ---->   left++即可
  3. sum==t   ---->   返回结果

总结:利用数组有序性,然后通过一次判断就可以干掉一个数,对比暴力解法,我们需要很多次判断才能干掉一个数,但是这里利用单调性,仅需判断一次就干掉一个数,这个算法的时间复杂度是O(N)(两个指针相向遍历数组)。

3. 代码实现

题目链接:查找总价格为目标值的两个商品

暴力枚举

class Solution {
public:vector<int> twoSum(vector<int>& price, int target) {      int i = 0, j = 0;int n = price.size();for (i = 0; i < n; i++) {for (j = i + 1; j < n; j++) {int sum = price[i] + price[j];if (sum == target)return {price[i], price[j]};}}return {-1, -1};}
};

提交记录:

 数据少的话还是可以的:

 双指针算法

class Solution {
public:vector<int> twoSum(vector<int>& price, int target) {int left = 0;int right = price.size() - 1;while (left < right) {if (price[left] + price[right] < target) {++left;} else if (price[left] + price[right] > target) {--right;} else {return {price[left], price[right]};}}//C++11的列表初始化,会隐式类型转化成vectorreturn {-1, -1};}
};

提交记录:

 制作不易,若有不足之处或出问题的地方,请各位大佬多多指教 ,感谢大家的阅读支持!!! 


http://www.mrgr.cn/news/64918.html

相关文章:

  • 第二十八章 Vue之自定义指令
  • 如果 MySQL 主库出现了问题,从库该何去何从呢?
  • 2024面试自动化测试面试题【含答案】
  • 几乎必然收敛 (almost surely convergence)
  • java设计模式之行为型模式(11种)
  • MySQL表状态status包含的内容(详细)
  • 代码随想录day15| 110.平衡二叉树 、 257. 二叉树的所有路径 、 404.左叶子之和、 222.完全二叉树的节点个数
  • dockerfile/docker-compose构建镜像上下文目录编写要点
  • 进程间通信小练习
  • 电子电气架构 --- Trace 32(劳特巴赫)多核系统的调试
  • 第1篇 引言
  • vscode ssh+clion+idea等本周小结-2024.11.3
  • 阿里巴巴Seata分布式事务解决方案
  • ubuntu20安装opencv3.2记录
  • 【linux指令】----如何创建一个子进程
  • 智能指针的原理和使用
  • 【论文复现】神经网络的公式推导与代码实现
  • 【react如何在chrome浏览器里面调试?】
  • DAY75WEB 攻防-验证码安全篇接口滥用识别插件复用绕过宏命令填入滑块类
  • 自由学习记录(18)
  • gdal连接pg(java案例)
  • 图神经网络在复杂系统中的应用
  • Python中常见的矩阵乘法操作
  • linux 系统扩容
  • 客户端时间 与 服务器时间
  • Flink本地模式安装详解