动态规划复习day04

继续说股票问题

题目: 买卖股票的最佳时机Ⅱ

解题思路

  1. 首先说明这题在力扣标记为简单的原因,看下面的贪心解法:

    class Solution {public int maxProfit(int[] prices) {int res = 0;int diff = 0;if (prices.length == 1) {return 0;}for (int i = 0; i < prices.length - 1; i++) {diff = prices[i+1] - prices[i];if (diff > 0) {res += diff;}}return res;}
    }
    

    没错,这就是原因,贪心的最简单解法,我们判断今天买进的话明天卖出赚不赚钱,赚钱的话,那我们就卖,不赚钱不管,如此即可完成。

  2. 只遍历一遍,因此时间复杂度为O(N),空间复杂度为O(1)。

回到正题

当然,本文还是动态规划专题,一般此类可以贪心的题目都伴随有动态规划解法。我们还是老规矩,按照步骤来。

  1. 状态和行为的定义

    1. 对于股票而言,我们的状态很明显就是当前第i天手里是否有股票,行为是今天是买股票还是卖股票,dp数组定义的自然就是当天的收入,亏钱的收入为负数表示即可。
  2. dp数组的定义
    1. 首先dp [i] [0] 表示今天是第i天,我手里没有股票,dp的值为今天我的收入
    2. dp [i] [1] 表示今天是第i天,我手上有股票,dp的值为今天我的收入。
  3. dp转移关系的定义
    1. dp [i] [0] = max(dp [i-1] [0],dp [i-1] [1] + prices[i]);

      • 前一天手里没股票,那我的收益就是昨天手里就有股票,我今天啥也没干,或者我昨天手里有股票,我今天抛了。这俩比较大的一个。
    2. dp [i] [1] = max(dp [i-1] [1],dp [i-1] [0]-prices[i]);
      • 前一天手里有股票,那要么我昨天手里就有股票,我今天啥也没干,要么,我昨天手里没股票,但是今天买了。

代码实现

class Solution {public int maxProfit(int[] prices) {int len = prices.length;if (len == 1) {return 0;}int[][] dp = new int[len][2];// base casedp[0][0] = 0;dp[0][1] = -prices[0];// dp转移思想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],dp[i-1][0]-prices[i]);}return dp[len-1][0];}
}

其实动态规划的这类简单题的思想也很常规,但重在熟能生巧,由简单到复杂。

动态规划的时间复杂度也是O(N),空间复杂度为O(N)。这里不再考虑优化,重点在分析的过程。

20200713:动态规划复习day04相关推荐

  1. 20200714:动态规划复习day05

    动态规划复习day05 今天继续说股票问题三 题目: 买卖股票的最佳时机Ⅲ 解题思路 同理,我们还是按照老样子走. 先判断状态和选择 状态:今天第i天,我手里是否有股票,以及我卖出过几次股票. 选择: ...

  2. 20200710:动态规划复习day03

    动态规划复习day03 今天来看股票问题1 题目一:买卖股票的最佳时机 解题思路 首先我们想到的不是动态规划的解法,是一个常规思路:找到后面与当前值的差值最大的那个值,即为我们需要找的卖出的day.因 ...

  3. 20200715:动态规划复习day06

    统计全1子矩阵 题目 思路与算法 代码实现 复杂度分析 题目 思路与算法 题意很好理解,但是本题的动态规划不是常规思路的,你需要很好的理解题意并仔细分析状态与转移关系,才能定义正确的dp数组以及其dp ...

  4. 20200708:动态规划复习day02

    写在前面 继续接着来写今天的动态规划系列 今天带来子序列相关的两道题,一起拓展动态规划的思路 题目一:最长上升子序列 解题思路 不再像昨天一样写我们如何找到状态选择的,直接来确定dp数组及其含义.没有 ...

  5. 动态规划复习-HDU1081

    注意多个测试用例,和poj不一样 注意输出用例结果之间要换行 代码如下: #include int rect[101][101]; int a[101], dp[101]; int n, mx; in ...

  6. 20200707:动态规划专题之不同路径

    动态规划复习day01 动态规划的题目一直是本人的弱项,这周尝试连续7天的动态规划专题,争取做到有的放矢. 不同路径Ⅰ和Ⅱ解析 题目一:不同路径 解题思路 依据动态规划解题的套路思路 确定状态和选择, ...

  7. NOIP复习篇———贪心

    NOIP复习篇---贪心 --------------------------------------------------------------------------------------- ...

  8. 算法设计与分析考前复习

    算法设计与分析考前复习 qiwang的NOJ系统在考前一天崩了,强烈建议开发新OJ 另外,由于以下这些题是我上完数电实验用了下午和晚上时间写的,可能会出一些错. 分治法复习 二分查找 描述 给定一个单 ...

  9. 中级软件设计师知识总结

    文章目录 复习进度 分型 一.面向对象 1 面向对象的概念 面向对象设计原则 2 UML 静态图/结构图包括: 动态图/行为图包括: 3 4 设计模式 设计模式概念 设计模式的分类 创建型模式 结构型 ...

最新文章

  1. WMI技术介绍和应用——查询本地用户和组
  2. js002-在HTML中使用JavaScript
  3. 洛谷 P1024 一元三次方程求解
  4. 蔡成功贷款警示:没事别玩高利贷
  5. css3 图片放大缩小闪烁效果
  6. python3、sqlmap下载与安装教程
  7. [C指针] 用图表解读C声明:Unscrambling C Declarations by Diagram
  8. “Python编程及大数据应用”课程教师(厦门)寒假研修班
  9. jsp页面播放服务器视频
  10. Hibernate SQL 查询
  11. 有关EEPROM AT24C02字节写入和页写入
  12. 如何给光耦输入端限流
  13. 学计算机用微软笔记本可以吗,当我用上二合一电脑的时候我还是个学生
  14. Racket GUI,使用message%显示图片
  15. 简繁体互换工具:opencc
  16. 为小巨人记一笔,等待明日新星的升起
  17. Intellij IDEA 2019 英文界面乱码问题解决
  18. PLATO上线LAAS协议Elephant Swap,用户可借此获得溢价收益
  19. phpWord设置页码奇偶页不同Footer::EVEN
  20. Set? set和Set set的区别?

热门文章

  1. 华为入局 VR 眼镜能让 VR 早普及几年?|CSDN博文精选
  2. 告别写笔记,AI 实时转写黑科技来了!
  3. 第二届字节跳动夏令营启动全球报名,图灵奖得主授课
  4. 蘑菇车联召开战略发布会 为用户提供无缝衔接的“人车生活”
  5. 程序员快放弃 Android 9.0 吧,10.0 正在来的路上!
  6. 软件也要歧视大龄程序员吗?
  7. 身为程序员的唐僧说:只要我不死,就能取到真经!
  8. 阿里、京东被曝全面“缩招”;YY CEO 身体植入芯片;Oculus 创始人离职 | 极客头条...
  9. 说要干掉苹果的罗永浩却打起了微软
  10. 李彦宏:我从未说过百度“All in AI”,这得怪陆奇