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

目录

要求

思路

核心逻辑

Code

示例演示

关键点


要求

力扣第121题

给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 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 必须在计算利润之后,确保不会在同一天买卖
相关推荐
智者知已应修善业1 天前
【51单片机中的打飞机设计】2023-8-25
c++·经验分享·笔记·算法·51单片机
智者知已应修善业1 天前
【51单片机按键调节占空比3位数码管显示】2023-8-24
c++·经验分享·笔记·算法·51单片机
.5481 天前
## Sorting(排序算法)
python·算法·排序算法
wuweijianlove1 天前
算法的平均复杂度建模与性能回归分析的技术7
算法·数据挖掘·回归
子琦啊1 天前
【算法复习】字符串 | 两个底层直觉,吃透高频题
linux·运维·算法
code_pgf1 天前
Octo 算法详解-开源通用机器人策略模型技术报告
算法·机器人·开源
嘻嘻哈哈樱桃1 天前
牛客经典101题题解集--动态规划
java·数据结构·python·算法·职场和发展·动态规划
脱氧核糖核酸__1 天前
LeetCode热题100——234.回文链表(两种解法)
c++·算法·leetcode·链表
IronMurphy1 天前
【算法四十二】118. 杨辉三角 198. 打家劫舍
算法
电科一班林耿超1 天前
第 16 课:动态规划专题(二)—— 子序列与子数组问题:面试最高频的 DP 题型
数据结构·算法·动态规划