买卖股票的最佳时机(动态规划)

目录

要求

思路

核心逻辑

Code

示例演示

关键点


要求

力扣第121题

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

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

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

思路

目标是:在最低价买入,最高价卖出,且卖出必须在买入之后。

核心逻辑

  1. 遍历每一天的价格
  2. 记录到当前为止的最低价格(作为可能的买入点)
  3. 计算如果今天卖出,能获得的最大利润 = 今天价格 - 历史最低价
  4. 不断更新最大利润

Code

javascript 复制代码
var maxProfit = function(prices) {
    let res = 0;                    // 最大利润,初始为0(不买卖)
    let minPrice = prices[0];       // 初始化第一天为最低价
    
    for (const p of prices) {       // 遍历每一天的价格
        res = Math.max(res, p - minPrice);  // 计算今天卖出的利润,更新最大利润
        minPrice = Math.min(minPrice, p);   // 更新历史最低价
    }
    
    return res;                     // 返回最大利润
};

示例演示

假设 prices = 7, 1, 5, 3, 6, 4

当前价格 历史最低价 当前利润(价格-最低) 最大利润res
7 7 0 0
1 1 0 0
5 1 4 4
3 1 2 4
6 1 5 5
4 1 3 5

结果:5(在第2天1元买入,第5天6元卖出)

关键点

  • 时间复杂度:O(n),只遍历一次
  • 空间复杂度:O(1),只用了常数空间
  • res 初始为0,保证如果价格一直下跌,不会亏本(选择不买卖)
  • 更新 minPrice 必须在计算利润之后,确保不会在同一天买卖
相关推荐
小宋加油啊4 小时前
机械臂抓取物体 PVN3D算法调研学习
学习·算法·3d
lqqjuly4 小时前
前沿算法深度解析(一)
算法
小欣加油5 小时前
leetcode1926 迷宫中离入口最近的出口
数据结构·c++·算法·leetcode·职场和发展
happymaker06267 小时前
LeetCodeHot100——42.接雨水
算法
阿正的梦工坊8 小时前
【Rust】07-错误处理:Option、Result 与 ? 运算符
开发语言·算法·rust
八解毒剂9 小时前
数据结构-平衡二叉树——对二叉搜索树的优化
数据结构·c++·算法
运行时记录10 小时前
别再手动写提示词了 — SkillOpt 让技能文档自己进化
算法
啦啦啦啦啦zzzz10 小时前
算法总结(二分查找、双指针)
c++·算法
qq_85730581910 小时前
python语法
开发语言·python·算法