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

LeetCode-贪心-买卖股票的最佳时机

image-20250520203051704

LeetCode-贪心-买卖股票的最佳时机

✏️ 关于专栏:专栏用于记录 prepare for the coding test


文章目录

  • LeetCode-贪心-买卖股票的最佳时机
    • 📝买卖股票的最佳时机
      • 🎯题目描述
      • 🔍 输入输出示例
      • 🧩题目提示
      • 🧪AC
    • 🚀 拓展思考
    • 🌟 总结

📝买卖股票的最佳时机

🎯题目描述

给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。

你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。

返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0

🔗题目链接:买卖股票的最佳时机

🔍 输入输出示例

示例 1:

输入:[7,1,5,3,6,4]
输出:5
解释:在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格;同时,你不能在买入前卖出股票。

示例 2:

输入:prices = [7,6,4,3,1]
输出:0
解释:在这种情况下, 没有交易完成, 所以最大利润为 0。

🧩题目提示

  • 1 <= prices.length <= 105
  • 0 <= prices[i] <= 104

🧪AC

  • 贪心算法:该题的核心在于实时维护最低买入价格 min_price,同时在遍历中计算当前价格卖出可获得的利润 p - min_price,不断更新最大利润 ans
  • 为什么贪心有效?
    • 买入时机只能往前找最低价格,卖出时机往后找最高价格,利润最大。
    • 只要保证每次计算的卖出价格比之前记录的最低买入价格高,就可以更新最大利润。
    • 不需要回溯或动态规划,时间复杂度是 O(n),空间复杂度 O(1)。
  • 边界条件
    • 当股票价格一直下降时,利润为0,即不进行交易。

本题的核心在于找到买入价格的最低点和随后卖出的最高点,确保买卖时序正确。

关键点分析:

  1. 必须保证卖出时间在买入时间之后。因此不能简单地用最大价格减最小价格。
  2. 用贪心算法解决: 在遍历过程中维护当前遇到的最低买入价格 min_price,并在每一天计算当前卖出价格 pmin_price 的差值,更新最大利润。
  3. 算法的正确性基于贪心选择性质
    • 每天的最低价格都是潜在的买入点,及时更新;
    • 利润最大时的卖出点是当前价格减去历史最低买入价。
class Solution {
public:int maxProfit(vector<int>& prices) {int ans = 0;int min_price = prices[0];for(int p : prices){ans = max(ans,p - min_price);min_price = min(min_price,p);}return ans;}
};

min_price:用于跟踪迄今为止遇到的最低股票价格,即最优买入点。

max_profit:用于记录遍历过程中的最大收益。

每次遍历:

  • 遇到更低价时更新买入点;
  • 否则尝试计算卖出利润,并更新最大利润。

最终返回最大利润。

🚀 拓展思考

  1. 多次交易场景
    • 如果允许多次买卖,如何设计算法?
      • 答:可以贪心累加每一次上涨区间的差值,参考“买卖股票的最佳时机 II”。
  2. 交易费用与冷冻期
    • 若每次交易需要付手续费,或卖出后有冷冻期,问题将变得复杂。
    • 此时可用动态规划方法,记录状态转移。
  3. 买卖股票含限价单
    • 限价单等交易策略可引入不同的约束和优化问题。
  4. 具体买卖日期
    • 本题只求最大利润,若需要具体买卖日期,只需在遍历时记录买入和卖出时的索引。

🌟 总结

  • 该题是经典的贪心问题,核心思想是实时维护最低买入价,计算最大卖出利润
  • 代码简洁,效率高,适合入门贪心算法题。
  • 理解该题,有助于掌握更复杂的股票买卖变种问题。

❤️ 如果对你有帮助,别忘了点赞、收藏支持一下,我将持续更新更多高质量刷题笔记!
📘 点击查看 👉 算法笔记专栏:Prepare for the Coding Test

http://www.xdnf.cn/news/625789.html

相关文章:

  • 【算法】力扣体系分类
  • QML学习05MouseArea
  • 51、c# 请列举出6个集合类及用途
  • VLLM推理可以分配不同显存限制给两张卡吗?
  • MongoDB 备份与恢复策略全面指南:保障数据安全的完整方案
  • springboot中redis的事务的研究
  • 深入理解nvidia container toolkit核心组件与流程
  • 10大Python知识图谱开源项目全解析
  • 【Linux 学习计划】-- Linux调试工具 - gdb cgdb
  • 怎么开发一个网络协议模块(C语言框架)之(二) 数据结构设计
  • RabbitMQ核心特性——重试、TTL、死信队列
  • python项目和依赖管理工具uv简介
  • OpenLayers 加载鼠标位置控件
  • git常用操作命令
  • 用本地大模型解析智能家居语音指令:构建一个离线可用的文本控制助手
  • vitepress | 文档:展示与说明只写一次,使用vitepress-deme-preview插件
  • 力扣HOT100之回溯:46. 全排列
  • juc面试题
  • LumaDot (亮度可调的屏幕圆点)
  • 分布式消息中间件基础
  • 网络协议与通信安全
  • Oracle 19c DG备库报错ORA-00313、ORA-00312、ORA-27037
  • 【Linux仓库】权限的量子纠缠:用户/组/other如何编织Linux访问控制网?
  • el-form 使用el-row el-col对齐 注意事项
  • 从碎片化到集成化:Profibus转Profinet网关引领设备管理数字化转型
  • 【TypeScript】知识点梳理(四)
  • 5月24日day35打卡
  • qiankun解决的问题
  • ABC406E 题解
  • python中Web框架Flask vs FastAPI 对比分析