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

目录

要求

思路

核心逻辑

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 必须在计算利润之后,确保不会在同一天买卖
相关推荐
dialect_9 小时前
CODEFORCES ROUND 1127 DIV2
开发语言·c++·算法
Nuanyt9 小时前
LeetCode Hot 100 链表专题(四)· 3 题(Java)
java·算法·leetcode·链表·双指针
灯澜忆梦9 小时前
LeetCode 1861. 旋转盒子|Go 双指针解法
算法
软件派10 小时前
生产动态数据智能风控:阈值判别、趋势预测、异常识别算法工程落地实战
前端·数据库·算法
ZhengEnCi18 小时前
模型训练完整流程:从数据准备到模型上线的 10 个关键步骤(全文可跑)
后端·算法
吞下星星的少年·-·1 天前
Div.3 CF 1131A题(排序,模拟)
算法·模拟·排序
aichitang20241 天前
代数拓扑学与现代前沿视角
考研·算法·数学建模·ai·拓扑学·高考
二本咕咕-机械转码1 天前
FreeRTOS深入解析(一)_链表与并发保护——哨兵循环链表、排序键游标、临界区与关调度
单片机·算法·链表
-银雾鸢尾-1 天前
两数之和-C++实现
c++·算法