【力扣】查找总价格为目标值的两个商品,双指针法

查找总价格为目标值的两个商品原题地址

方法一:双指针

这道题和力扣第一题“两数之和”非常像,区别是这道题已经把数组排好序了,所以不考虑暴力枚举和哈希集合的方法,而是利用单调性,使用双指针求解

考虑数组 price 的 2 个下标 left 和 right ,对于 [left,right] ,有 C_{right-left+1}^{2} 种配对方法,我们需要利用单调性剔除一些可能

不妨设 price[left]+price[right]<target ,考虑 [left+1,right-1] 范围内的下标(记为 m ),有 price[left]+price[m]<price[left]+price[right]<target ,所以 left 不可能与 [left+1,right] 的任何下标配对,此时让 left 右移,在 [left+1,right] 的范围内寻找配对。同理,若 price[left]+price[right]>target ,考虑 right 和 [left+1,right-1] 范围内的下标(记为 n ),有 price[right]+price[n]>price[right]+price[left]>target ,所以 right 不可能与 [left,right-1] 的任何下标配对,此时让 right 左移,在 [left,right-1] 的范围内寻找配对

反复执行上述操作,直到 left=right 或者找到符合 price[left]+price[right]=target 的配对。

// 方法一:双指针
class Solution
{
public:vector<int> twoSum(vector<int>& price, int target){int left = 0, 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] };}}return {};}
};

方法二:哈希表

如果数组没有排好序呢?参考【力扣】两数之和,暴力枚举 + 哈希表的思路,其中暴力枚举会超时,这里附上本题的哈希表解法。

// 方法二:哈希表(适用于数组未排序的情况)
class Solution
{
public:vector<int> twoSum(vector<int>& price, int target){unordered_set<int> us;for (int i = 0; i < price.size(); ++i){// 哈希表中有元素与之匹配auto it = us.find(target - price[i]);if (it != us.end()){return { *it, price[i] };}// 存入哈希表us.insert(price[i]);}return {};}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/460813.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android 环境搭建

1、桥接工具安装 网站地址&#xff1a;AndroidDevTools - Android开发工具 Android SDK下载 Android Studio下载 Gradle下载 SDK Tools下载 使用安装包&#xff1a; adb 查看当前链接成功的设备&#xff1a;adb devices 使用adb shell指令来进入到手机的后台&#xff1a;

Redis篇之缓存击穿

一、什么是缓存击穿 1.缓存击穿的定义 缓存击穿&#xff1a;给某一个key设置了过期时间&#xff0c;当key过期的时候。恰好这时间点对这个key有大量的并发请求过来&#xff0c;这些并发的请求可能会瞬间把DB压垮。 2.图片理解 二、那么应该如何解决呢 1.方案一&#xff1a;…

C语言——移除元素(三种方法)

目录 前言 ​一.暴力遍历 二.临时数组 三.双指针法(推荐) 前言 https://leetcode.cn/problems/remove-element/ 这是力扣上的一道简单题&#xff0c;我们可以根据前面所讲的顺序表中的删除来实现&#xff0c;同时还有多种解法&#xff0c;下面将依次讲解 一.暴力遍历 这…

【高阶数据结构】位图布隆过滤器

文章目录 1. 位图1.1什么是位图1.2为什么会有位图1.3 实现位图1.4 位图的应用 2. 布隆过滤器2.1 什么是布隆过滤器2.2 为什么会有布隆过滤器2.3 布隆过滤器的插入2.4 布隆过滤器的查找2.5 布隆过滤器的模拟实现2.6 布隆过滤器的优点2.7 布隆过滤器缺陷 3. 海量数据面试题3.1 哈…

Android开发-之屏幕适配

Android开发-之屏幕适配 前言 Android 系统能发展到今天&#xff0c;离不开其开源性&#xff0c;但是随着越来越多的设备接入 Android 系统&#xff0c;并对 Android 系统进行各种各样的定制&#xff0c;导致长期以来出现了各种碎片化严重的问题。例如&#xff0c;Android 屏…

基于Chrome插件的Chatgpt对话无损导出markdown格式(Typora完美显示)

刚刚提交插件到Chrome插件商店正在审核&#xff0c;想尝试的可以先使用&#xff1a; https://github.com/thisisbaiy/ChatGPT-To-Markdown-google-plugin/tree/main 我将源代码上传至了GitHub&#xff0c;欢迎star, IssueGoogle插件名称为&#xff1a;ChatGPT to MarkDown plus…

STM32输出PWM波控制180°舵机

时间记录&#xff1a;2024/2/8 一、PWM介绍 &#xff08;1&#xff09;脉冲宽度调制 &#xff08;2&#xff09;占空比&#xff1a;高电平时间占整个周期时间的比例 &#xff08;3&#xff09;STM32通过定时器实现PWM时具有两种模式 PWM1模式&#xff1a;向上计数模式下&…

Guava RateLimiter单机实战指南

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 Guava RateLimiter单机实战指南 前言maven坐标引入业务实现重要参数和方法关于warmupPeriod实战 前言 想象一下你是一位大厨&#xff0c;正在烹饪美味佳肴。突然之间&#xff0c;前来就餐的人潮如潮水…

如何判断线程池已经执行完所有任务了?

目录 不判断的问题 方法1&#xff1a;isTerminated 缺点分析 扩展&#xff1a;线程池的所有状态 方法2&#xff1a;getCompletedTaskCount 方法说明 优缺点分析 方法3&#xff1a;CountDownLatch&#xff08;推荐&#xff09; 优缺点分析 方法4&#xff1a;CyclicBar…

第五篇【传奇开心果系列】vant开发移动应用示例:深度解读高度可定制

传奇开心果博文系列 系列博文目录Vant 开发移动应用示例系列 博文目录前言一、Vant高度可定制的重要作用二、样式定制介绍和示例代码三、组件定制介绍和示例代码四、组件库定制介绍和示例代码五、主题定制介绍和示例代码六、语言环境定制介绍和示例代码七、资源加载定制介绍和示…

电视盒子哪个牌子好?经销商整理线下热销电视盒子排名

买电视盒子的时候不懂电视盒子哪个牌子好的朋友超级多&#xff0c;近来我看到很多网友在讨论电视盒子&#xff0c;我按照店内的销量情况整理了热销电视盒子排名&#xff0c;跟着我一起看看目前实体店最受欢迎的电视盒子都有哪些吧。 NO.1 泰捷WEBOX WE40S电视盒子 推荐理由&am…

创新指南|生成式AI实验 - 企业快速渐进采用人工智能的科学新方法

生成式人工智能&#xff08;Gen AI&#xff09;正迅速成为各行各业的企业创新焦点。 生成式AI实验对于企业创新而言至关重要&#xff0c;不仅可以帮助企业识别最适合和最有影响的应用场景&#xff0c;还能促进组织沿着生成式 AI 学习曲线前进&#xff0c;建立早期的创新领导者和…