105. Leetcode 121. 买卖股票的最佳时机 (动态规划-股票交易)
给定一个数组 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. 买卖股票的最佳时机 (动态规划-股票交易)相关推荐
- LeetCode #121 买卖股票的最佳时机 贪心 单调栈 动态规划
LeetCode #121 买卖股票的最佳时机 题目描述 给定一个数组,它的第 iii 个元素是一支给定股票第 iii 天的价格. 如果你最多只允许完成一笔交易(即买入和卖出一支股票一次),设计一个算 ...
- leetcode - 121.买卖股票的最佳时机
121.买卖股票的最佳时机 ------------------------------------------ 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 如果你最多只允许完成 ...
- LeetCode - 121. 买卖股票的最佳时机
121. 买卖股票的最佳时机 class Solution {public int maxProfit(int[] prices) {if (prices == null || prices.leng ...
- LeetCode 121:买卖股票的最佳时机 思考分析
题目描述: 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 如果你最多只允许完成一笔交易(即买入和卖出一支股票一次),设计一个算法来计算你所能获取的最大利润. 注意:你不能在买入股票 ...
- leetcode.121. 买卖股票的最佳时机(best-time-to-buy-and-sell-stock)
文章目录 121. 买卖股票的最佳时机 代码与思路 暴力法 一次遍历 单调栈 122. 买卖股票的最佳时机 II 代码与思路 股票问题系列通解 121. 买卖股票的最佳时机 给定一个数组,它的第 i ...
- LeetCode:121.买卖股票的最佳时机——动态规划
- leetcode 121. 买卖股票的最佳时机 (贪心 + 动规 + 双指针
贪心的思路: 得到最小值,再挨个用数组中的值减去最小值,最终值取一个最大的 class Solution { public:int maxProfit(vector<int>& p ...
- leetcode hot100------121. 买卖股票的最佳时机--动态规划知识点
暴力法需要二重循环,解法二通过动态规划使得只需要一次遍历即可找到最大值,动态规划适用于多阶段决策过程的最优化问题,明显这里就是一个决定什么时候买和卖出的阶段决策问题. 如果我们用dp[i]表示从第1天 ...
- LeetCode: 121. 买卖股票的最佳时机(C++)
题目: 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润. 注意你不能在买入股票前卖出股票 ...
最新文章
- Java项目:高校学生社团活动管理系统(java+springboot+freemark+jpa+mysql)
- matlab最大化函数,求助,最大化一个函数
- Android基础——框架模式MVC在安卓中的实践
- 洛谷 P2197 nim游戏
- 演示:混合配置基于Linux winows cisco环境动态路由
- .NET微服务最佳实践eShopOnContainers
- linux增量安装tomcat_Linux服务器上的tomcat中部署web项目
- NumPy Cookbook 带注释源码 十、Scikit 中的乐趣
- [翻译] GiFHUD
- [渝粤教育] 广东-国家-开放大学 21秋期末考试标准的研制与编制★10003k1
- 【ArcGIS|空间分析|网络分析】1 创建网络数据集
- freemarker 标签循环list 以及获取下标值
- ctf不允许上传该类型php,d3ctf easyweb题解
- 电脑端登陆OneNote时提示0x8019001错误
- 通过crond定时任务自动更新动态IP到PubYun(3322)实现远程访问
- 为PXI硬件选择合适的设备驱动程序–VISA还是IVI?
- 7款浏览器新标签页扩展让你的Chrome耳目一新
- Photoshop CS6 序列号完美激活教程
- 观影《超时空接触》有感
- AndroidStudio运行模拟器--夜神
热门文章
- HaProxy介绍,安装及配置
- String是一个很普通的类 - Java那些事儿
- 解决 Android ping IPv6 地址显示 network is unreachable 的问题
- 不要使用字符串常量作为对象锁去同步代码
- 开源 java CMS - FreeCMS2.4 工作流管理
- U2L蔚然成风,曙光为什么能抢了VMware的风头?
- IPv4的核心管理功能/proc/sys/net/ipv4/*
- [转] UML类图的几种关系总结
- sql2005还原出现“受限制用户”解决方法
- CSP认证201412-3	集合竞价[C++题解]:枚举、结构体