难度:简单
频率: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 动态规划(原名字不通过审核)相关推荐

  1. leetCode:121\122\309 股票买入和卖出获取最大收益问题

    /**leetCode 121 :动态规划求 最佳买入和卖出股票给出一组int数组,每个值代表当天股票的价格,你只能买1次并且卖1次,求最大收益动态规划求解: */ int maxProfit(vec ...

  2. 动态规划——买卖股票的最好时机(Leetcode 121)

    题目选自Leetcode 121. 买卖股票的最佳时机 提示:股票系列问题有共通性,但难度较大,初次接触此类问题的话很难看懂下述思路,建议直接看labuladong大神的题解 题目描述: 解题思路: ...

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

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

  4. 【贪心 和 DP + 卖股票】LeetCode 121. Best Time to Buy and Sell Stock

    LeetCode 121. Best Time to Buy and Sell Stock Solution1:我的答案 动态规划和贪心不要区分的那么明显嘛~~~ class Solution { p ...

  5. LeetCode题解 - 动态规划-股票买卖

    LeetCode题解 - 动态规划-股票买卖 文章目录 LeetCode题解 - 动态规划-股票买卖 **一.穷举框架** **二.状态转移框架** **三.秒杀题目** 121. 买卖股票的最佳时机 ...

  6. 【LeetCode】动态规划入门(专项打卡21天合集)

    [LeetCode]动态规划入门(专项打卡21天合集) 下图为证 文章目录 [LeetCode]动态规划入门(专项打卡21天合集) Day1 斐波拉契数 第 N 个泰波那契数 Day2 爬楼梯 使用最 ...

  7. leetcode 121

    leetcode 121 dp? my answer class Solution {public:int maxProfit(vector<int>& prices) {int ...

  8. 批量修改图片名称(去掉原名字中的中文字符和空格)

    python批量修改图片名称,去掉原名字中的中文字符和空格 如名字:KJG-A电泵冷油器泄漏4-20190219161731 (1).jpg-->KJG-A4-20190219161731(1) ...

  9. Leetcode之动态规划(DP)专题-1025. 除数博弈(Divisor Game)

    Leetcode之动态规划(DP)专题-1025. 除数博弈(Divisor Game) 爱丽丝和鲍勃一起玩游戏,他们轮流行动.爱丽丝先手开局. 最初,黑板上有一个数字 N .在每个玩家的回合,玩家需 ...

最新文章

  1. 设置Mybatis(3.2.8)实体嵌套关系(一对多,多对多)遇到的问题及经验总结记录...
  2. Yum在线升级之网络(本地)服务器的搭建!
  3. MySQL · 引擎特性 · InnoDB 崩溃恢复过程
  4. 第二篇T语言实例开发(版本5.3),福彩3D摇号器
  5. CentOS6.5 gcc升级到4.8.2
  6. boost::polygon模块实现自定义点相关的测试程序
  7. OPENSSL X509证书验证
  8. 【白皮书分享】抖音企业号-服装行业白皮书.pdf(附下载链接)
  9. 图像检索简介--笔记
  10. 《国富论》阅读笔记05
  11. 自动加减工单结存算法实现
  12. UE4-PixelStreaming(虚幻引擎4-像素流技术)笔记
  13. Scala基础语法学习
  14. mysql数据库算法_MySql联接算法
  15. 国产化操作系统的参考
  16. kafka 0.10.0.0 版本
  17. 读取nii或nii.gz文件中的信息即输出图像
  18. 我是怎么和SAP结缘的 - Jerry的SAP校园招聘之路
  19. 计算机网络设计校园大楼网络,计算机网络东区学生宿舍楼校园网规划及设计.docx...
  20. 虎符CTF--MISC--奇怪的组织

热门文章

  1. 大致了解写java聊天器所需要的技术
  2. Mpmovieplayercontroller 黑屏
  3. struts2 简单应用
  4. UGUI内核大探究(一)EventSystem
  5. React Native For Android 环境搭建
  6. Spark Streaming 执行流程
  7. NetMarketShare:本月桌面浏览器市场份额几乎没有变化
  8. Mysql 批量写入数据 性能优化
  9. 创建ACFS集群文件系统(命令方式)
  10. swift开发记录 - MARK,TODO,FIXME