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

【力扣刷题实战】查找总价格为目标值的两个商品

大家好,我是小卡皮巴拉

文章目录

目录

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

题目描述

解题思路

问题理解

算法选择

具体思路

解题要点

完整代码(C++)

兄弟们共勉 !!! 


每篇前言

博客主页:小卡皮巴拉

咱的口号:🌹小比特,大梦想🌹

作者请求:由于博主水平有限,难免会有错误和不准之处,我也非常渴望知道这些错误,恳请大佬们批评斧正。

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

原题链接:LCR 179. 查找总价格为目标值的两个商品 - 力扣(LeetCode)

题目描述

购物车内的商品价格按照升序记录于数组 price。请在购物车中找到两个商品的价格总和刚好是 target。若存在多种情况,返回任一结果即可。

示例 1:

输入:price = [3, 9, 12, 15], target = 18
输出:[3,15] 或者 [15,3]

示例 2:

输入:price = [8, 21, 27, 34, 52, 66], target = 61
输出:[27,34] 或者 [34,27]

解题思路

问题理解

题目给定一个升序排列的商品价格数组 price,要求在数组中找到两个元素,使得它们的和恰好等于目标值 target。如果存在多组满足条件的元素,只需返回其中任意一组结果。

算法选择

采用双指针算法。由于数组已经是升序排列,使用双指针分别从数组的两端开始遍历,通过调整指针的位置来寻找满足条件的两个元素,这样可以在较低的时间复杂度内解决问题,避免了暴力枚举所有元素对的高时间复杂度。

具体思路

  1. 初始化双指针:定义左指针 left 指向数组的起始位置(即 0),右指针 right 指向数组的末尾位置(即 price.size() - 1)。

  2. 循环遍历:在 left < right 的条件下进行循环:

    • 计算当前左指针和右指针所指元素的和 price[left] + price[right]

    • 如果和小于目标值 target,说明当前的两个元素之和过小,将左指针 left 右移一位,增大和的值,继续寻找。

    • 如果和大于目标值 target,说明当前的两个元素之和过大,将右指针 right 左移一位,减小和的值,继续寻找。

    • 如果和等于目标值 target,则找到了满足条件的两个元素,直接返回这两个元素组成的向量。

  3. 返回结果:如果循环结束后仍未找到满足条件的两个元素,即 left >= right 时,返回一个空向量,表示没有找到符合条件的元素对。

解题要点

  1. 数组有序:数组必须是升序排列的,这是使用双指针算法的前提条件,只有在有序数组中,才能根据指针所指元素之和与目标值的大小关系来合理移动指针。

  2. 指针移动策略:根据当前两个指针所指元素之和与目标值的大小关系,准确地移动左指针或右指针。和小于目标值时左指针右移,和大于目标值时右指针左移。

  3. 循环结束条件:循环的结束条件是 left < right,当 left >= right 时,说明已经遍历完所有可能的元素对,若还未找到满足条件的结果,则不存在这样的两个元素。

完整代码(C++)

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 {}; // 未找到符合条件的元素,返回空向量
    }
};

兄弟们共勉 !!! 

码字不易,求个三连

抱拳了兄弟们!

相关文章:

  • C++从零实现Json-Rpc框架
  • Flink测试环境Standalone模式部署实践
  • Java17中LinkedList类介绍、应用场景和示例代码
  • 《AI浪潮中的璀璨新星:Meta Llama、Ollama与DeepSeek的深度剖析》
  • Yashan DB 文件管理
  • Linux 进程控制:创建、终止、等待与程序替换全解析
  • 网页打印很简单!用web打印插件lodop轻松实现文件打印
  • mac 本地 docker 安装 kafka
  • [多线程]基于阻塞队列(Blocking Queue)的生产消费者模型的实现
  • Windows11日志文件位置Linux下的目录简介
  • 深度解读:OpenAI发布GPT-5的技术突破与商业影响
  • AI科技公司招聘一位后端开发工程师
  • Git的命令学习——适用小白版
  • 菜鸟之路Day23一一JavaScript 入门
  • go的”ambiguous import in multiple modules”
  • Ubuntu开荒
  • 专题三二分算法
  • 工作记录 2017-01-04
  • 人工智能直通车系列15【机器学习基础】(决策树算法原理(ID3、C4.5、CART)决策树模型实现)
  • CENTOS7虚拟机硬盘不停机扩容
  • 小米汽车回应部分SU7前保险杠形变
  • 没有握手,采用翻译:俄乌三年来首次直接会谈成效如何?
  • 会谈时间迟迟未定、核心议题存在分歧,俄乌“土耳其谈判”一波三折
  • 收到延期付款利息,该缴纳增值税吗?
  • 圆桌丨新能源车超充技术元年,专家呼吁重视电网承载能力可能面临的结构性挑战
  • 腾讯一季度营收增长13%,马化腾:战略性的AI投入将带来长期回报