给定一个数组 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。

步骤一、确定状态:

确定dp数组及下标含义

dp[i]是一个长度为len(prices)的一维数组,表示的是在第i天可以获取的最大利润,但是我们知 道第i天其实有两种状态: 持有股票和不持有股票,所以该一维数组的每个元素又会有两个状态:

dp[i][0]表示的是第i天不持有股票所得的最大利润

dp[i][1]表示的是第i天持有股票所得的最大利润这里的持有不代表当天买入, 可能昨天就买入了, 而今天还没卖,所以持有。

步骤二、推断状态方程:

由于dp[i]会有两种状态,那么得需要分情况讨论: 如果第i天不持有股票, 即dp[i][0], 那么有两个状态推过来:

1、第i-1天不持有股票,保持现状过来的, 所得的利润就是昨天不持有股票的 最大利润dp[i-1][0]

2、第i−1天持有股票,但在第i天卖出去了,这时候所得利润是今天的价格加昨 天的最大利润,注意我们这里已经把成本抛出去了,因为一开始就是算的纯利润, 把买入成本算到了最开始里面,所以这里直接价格加前面的利润,昨天就开始赚 了,所以此时dp[i-1][1] + prices[i]

dp[i][0]选择利润最大的: dp[i][0] = max(dp[i-1][0], dp[i-1][1]+prices[i])

如果第i天持有股票,即dp[i][1], 那么同样两个状态过来:

1、第i-1天就持有股票, 保持现状过来的, 最大利润就是昨天持有股票的最 大利润dp[i-1][1]

2、第i-1天没有股票,第i天刚买进来的, 那这时候的最大利润就是-prices[i], 因为股票只能买卖一次, 所以前面没有股票说明就一直没有股票,利润是0, 这个很重要, 所以这时候突然买股票,利润当然是负数了, 并且这里也是直 接用的价格,也就是假设了我们一开始拥有的钱是0, 那么上面那个直接加 price也是合理的。

dp[i][1]选择最大的: dp[i][1] = max(dp[i-1][1], -prices[i])

步骤三、规定初始条件:

初始条件:

全局初始化为0, 局部初始化根据递推公式,后面的状态依赖于前一天的状态, 基础从dp[0][0]和dp[0][1]过来的,必须初始化这两个

dp[0][0] 表示第0天不持有股票的最大利润, 就是不买第0天的股票呗, dp[0][0]=0

dp[0][1] 表示第0天持有股票的最大利润,就是买入了第0天的股票呗,利润 是负值,dp[0][1]=-prices[0]

步骤四、计算顺序:

从左往右, 从1开始遍历,返回的是最后没有股票时候的最大利润, 也就是dp[-1][0]

class Solution:def maxProfit(self, prices: List[int]) -> int:if len(prices) < 2:return 0dp = [[0,0] for _ in range(len(prices))]dp[0][0] = 0dp[0][1] = -prices[0]for i in range(1, len(prices)):dp[i][0] = max(dp[i-1][0], dp[i-1][1] + prices[i])dp[i][1] = max(dp[i-1][1], -prices[i])return dp[-1][0]

105. Leetcode 121. 买卖股票的最佳时机 (动态规划-股票交易)相关推荐

  1. LeetCode #121 买卖股票的最佳时机 贪心 单调栈 动态规划

    LeetCode #121 买卖股票的最佳时机 题目描述 给定一个数组,它的第 iii 个元素是一支给定股票第 iii 天的价格. 如果你最多只允许完成一笔交易(即买入和卖出一支股票一次),设计一个算 ...

  2. leetcode - 121.买卖股票的最佳时机

    121.买卖股票的最佳时机 ------------------------------------------ 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 如果你最多只允许完成 ...

  3. LeetCode - 121. 买卖股票的最佳时机

    121. 买卖股票的最佳时机 class Solution {public int maxProfit(int[] prices) {if (prices == null || prices.leng ...

  4. LeetCode 121:买卖股票的最佳时机 思考分析

    题目描述: 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 如果你最多只允许完成一笔交易(即买入和卖出一支股票一次),设计一个算法来计算你所能获取的最大利润. 注意:你不能在买入股票 ...

  5. leetcode.121. 买卖股票的最佳时机(best-time-to-buy-and-sell-stock)

    文章目录 121. 买卖股票的最佳时机 代码与思路 暴力法 一次遍历 单调栈 122. 买卖股票的最佳时机 II 代码与思路 股票问题系列通解 121. 买卖股票的最佳时机 给定一个数组,它的第 i ...

  6. LeetCode:121.买卖股票的最佳时机——动态规划

  7. leetcode 121. 买卖股票的最佳时机 (贪心 + 动规 + 双指针

    贪心的思路: 得到最小值,再挨个用数组中的值减去最小值,最终值取一个最大的 class Solution { public:int maxProfit(vector<int>& p ...

  8. leetcode hot100------121. 买卖股票的最佳时机--动态规划知识点

    暴力法需要二重循环,解法二通过动态规划使得只需要一次遍历即可找到最大值,动态规划适用于多阶段决策过程的最优化问题,明显这里就是一个决定什么时候买和卖出的阶段决策问题. 如果我们用dp[i]表示从第1天 ...

  9. LeetCode: 121. 买卖股票的最佳时机(C++)

    题目: 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润. 注意你不能在买入股票前卖出股票 ...

最新文章

  1. Java项目:高校学生社团活动管理系统(java+springboot+freemark+jpa+mysql)
  2. matlab最大化函数,求助,最大化一个函数
  3. Android基础——框架模式MVC在安卓中的实践
  4. 洛谷 P2197 nim游戏
  5. 演示:混合配置基于Linux winows cisco环境动态路由
  6. .NET微服务最佳实践eShopOnContainers
  7. linux增量安装tomcat_Linux服务器上的tomcat中部署web项目
  8. NumPy Cookbook 带注释源码 十、Scikit 中的乐趣
  9. [翻译] GiFHUD
  10. [渝粤教育] 广东-国家-开放大学 21秋期末考试标准的研制与编制★10003k1
  11. 【ArcGIS|空间分析|网络分析】1 创建网络数据集
  12. freemarker 标签循环list 以及获取下标值
  13. ctf不允许上传该类型php,d3ctf easyweb题解
  14. 电脑端登陆OneNote时提示0x8019001错误
  15. 通过crond定时任务自动更新动态IP到PubYun(3322)实现远程访问
  16. 为PXI硬件选择合适的设备驱动程序–VISA还是IVI?
  17. 7款浏览器新标签页扩展让你的Chrome耳目一新
  18. Photoshop CS6 序列号完美激活教程
  19. 观影《超时空接触》有感
  20. AndroidStudio运行模拟器--夜神

热门文章

  1. HaProxy介绍,安装及配置
  2. String是一个很普通的类 - Java那些事儿
  3. 解决 Android ping IPv6 地址显示 network is unreachable 的问题
  4. 不要使用字符串常量作为对象锁去同步代码
  5. 开源 java CMS - FreeCMS2.4 工作流管理
  6. U2L蔚然成风,曙光为什么能抢了VMware的风头?
  7. IPv4的核心管理功能/proc/sys/net/ipv4/*
  8. [转] UML类图的几种关系总结
  9. sql2005还原出现“受限制用户”解决方法
  10. CSP认证201412-3 集合竞价[C++题解]:枚举、结构体