Leetcode 121 动态规划(原名字不通过审核)
难度:简单
频率:145
题目:
给定一个数组prices,它的第i个元素prices[i]表示一只给定股票第i天的价格。
你只能选择某一天买入这只股票,并选择在未来某一个不同的日子卖出该股票。设计一个算法来计算你所能获取的最大利润。
返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回0。
解题方法:动态规划、暴力解法[两遍循环]
- 动态规划用于多阶段决策问题;
- 动态规划问题的问法:只问最优解,不问具体解;
- 掌握无后效性解决动态规划问题:把约束条件设置成为状态。
解题思路:
1.题目只问最大利润,没有问这几天具体哪一天买,哪一天卖。 也就是只问 最优解,不问具体解。
2.找出约束条件【无后效性】:
- 条件①:你不能在买股票前卖出股票。
- 条件②:最多只允许完成一笔交易。
因此当天是否持股 是一个很重要的因素,而当前是否持股和昨天是否持股有关系,为此我们需要把是否持股涉及到状态数组中。
状态定义:
dp[i][j]:下表为i这一天结束时,持股状态为j时,我们持有的现金数。
- j=0,表示当前不持股。
- j=1,表示当前持股。
推导状态转移方程:
dp[i][0]:规定今天不持股,有以下两种情况:
- 昨天不持股,今天什么都不做;
- 昨天持股,今天卖出(现金增加);
dp[i][1]:规定今天持股,有以下两种情况 - 昨天持股,今天什么都不做;
- 昨天不持股,今天买入(手上的现金时当天股价的反数)
public class Solution {public int maxProfit(int[] prices) {int len=prices.length;if(len<2){return 0;}int [][] dp=new int[len][2];dp[0][0]=0;dp[0][1]=-prices[0];//从第二天开始遍历for(int i=1;i<len;i++){ dp[i][0]=Math.max(dp[i-1][0],dp[i-1][1]+prices[i]);dp[i][1]=Math.max(dp[i-1][1],-prices[i]);}return dp[len-1][0];}
}
重点注意的地方:
首先判断是否适合动态规划
- 特征1:只求最值,不求具体值。
- 特征2:多阶段决策,每天都能做决定【0 or 1】
状态方程很重要
- 状态转移方程里需要考虑无后效性,即约束条件,例如买股票只能买卖一次、卖只能在卖后面。
- dp[i][x]
遍历是从第二天开始,因为状态转移方程的每一天都跟前一天有关,i=0,则i-1会变成负数。
二维数组 int[len][2]
返回值为最后一天没持股的金额
Leetcode 121 动态规划(原名字不通过审核)相关推荐
- leetCode:121\122\309 股票买入和卖出获取最大收益问题
/**leetCode 121 :动态规划求 最佳买入和卖出股票给出一组int数组,每个值代表当天股票的价格,你只能买1次并且卖1次,求最大收益动态规划求解: */ int maxProfit(vec ...
- 动态规划——买卖股票的最好时机(Leetcode 121)
题目选自Leetcode 121. 买卖股票的最佳时机 提示:股票系列问题有共通性,但难度较大,初次接触此类问题的话很难看懂下述思路,建议直接看labuladong大神的题解 题目描述: 解题思路: ...
- LeetCode #121 买卖股票的最佳时机 贪心 单调栈 动态规划
LeetCode #121 买卖股票的最佳时机 题目描述 给定一个数组,它的第 iii 个元素是一支给定股票第 iii 天的价格. 如果你最多只允许完成一笔交易(即买入和卖出一支股票一次),设计一个算 ...
- 【贪心 和 DP + 卖股票】LeetCode 121. Best Time to Buy and Sell Stock
LeetCode 121. Best Time to Buy and Sell Stock Solution1:我的答案 动态规划和贪心不要区分的那么明显嘛~~~ class Solution { p ...
- LeetCode题解 - 动态规划-股票买卖
LeetCode题解 - 动态规划-股票买卖 文章目录 LeetCode题解 - 动态规划-股票买卖 **一.穷举框架** **二.状态转移框架** **三.秒杀题目** 121. 买卖股票的最佳时机 ...
- 【LeetCode】动态规划入门(专项打卡21天合集)
[LeetCode]动态规划入门(专项打卡21天合集) 下图为证 文章目录 [LeetCode]动态规划入门(专项打卡21天合集) Day1 斐波拉契数 第 N 个泰波那契数 Day2 爬楼梯 使用最 ...
- leetcode 121
leetcode 121 dp? my answer class Solution {public:int maxProfit(vector<int>& prices) {int ...
- 批量修改图片名称(去掉原名字中的中文字符和空格)
python批量修改图片名称,去掉原名字中的中文字符和空格 如名字:KJG-A电泵冷油器泄漏4-20190219161731 (1).jpg-->KJG-A4-20190219161731(1) ...
- Leetcode之动态规划(DP)专题-1025. 除数博弈(Divisor Game)
Leetcode之动态规划(DP)专题-1025. 除数博弈(Divisor Game) 爱丽丝和鲍勃一起玩游戏,他们轮流行动.爱丽丝先手开局. 最初,黑板上有一个数字 N .在每个玩家的回合,玩家需 ...
最新文章
- 设置Mybatis(3.2.8)实体嵌套关系(一对多,多对多)遇到的问题及经验总结记录...
- Yum在线升级之网络(本地)服务器的搭建!
- MySQL · 引擎特性 · InnoDB 崩溃恢复过程
- 第二篇T语言实例开发(版本5.3),福彩3D摇号器
- CentOS6.5 gcc升级到4.8.2
- boost::polygon模块实现自定义点相关的测试程序
- OPENSSL X509证书验证
- 【白皮书分享】抖音企业号-服装行业白皮书.pdf(附下载链接)
- 图像检索简介--笔记
- 《国富论》阅读笔记05
- 自动加减工单结存算法实现
- UE4-PixelStreaming(虚幻引擎4-像素流技术)笔记
- Scala基础语法学习
- mysql数据库算法_MySql联接算法
- 国产化操作系统的参考
- kafka 0.10.0.0 版本
- 读取nii或nii.gz文件中的信息即输出图像
- 我是怎么和SAP结缘的 - Jerry的SAP校园招聘之路
- 计算机网络设计校园大楼网络,计算机网络东区学生宿舍楼校园网规划及设计.docx...
- 虎符CTF--MISC--奇怪的组织