20200713:动态规划复习day04
动态规划复习day04
继续说股票问题
题目: 买卖股票的最佳时机Ⅱ
解题思路
首先说明这题在力扣标记为简单的原因,看下面的贪心解法:
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;} }
没错,这就是原因,贪心的最简单解法,我们判断今天买进的话明天卖出赚不赚钱,赚钱的话,那我们就卖,不赚钱不管,如此即可完成。
只遍历一遍,因此时间复杂度为O(N),空间复杂度为O(1)。
回到正题
当然,本文还是动态规划专题,一般此类可以贪心的题目都伴随有动态规划解法。我们还是老规矩,按照步骤来。
- 状态和行为的定义
- 对于股票而言,我们的状态很明显就是当前第i天手里是否有股票,行为是今天是买股票还是卖股票,dp数组定义的自然就是当天的收入,亏钱的收入为负数表示即可。
- dp数组的定义
- 首先dp [i] [0] 表示今天是第i天,我手里没有股票,dp的值为今天我的收入
- dp [i] [1] 表示今天是第i天,我手上有股票,dp的值为今天我的收入。
- dp转移关系的定义
- dp [i] [0] = max(dp [i-1] [0],dp [i-1] [1] + prices[i]);
- 前一天手里没股票,那我的收益就是昨天手里就有股票,我今天啥也没干,或者我昨天手里有股票,我今天抛了。这俩比较大的一个。
- dp [i] [1] = max(dp [i-1] [1],dp [i-1] [0]-prices[i]);
- 前一天手里有股票,那要么我昨天手里就有股票,我今天啥也没干,要么,我昨天手里没股票,但是今天买了。
- dp [i] [0] = max(dp [i-1] [0],dp [i-1] [1] + 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相关推荐
- 20200714:动态规划复习day05
动态规划复习day05 今天继续说股票问题三 题目: 买卖股票的最佳时机Ⅲ 解题思路 同理,我们还是按照老样子走. 先判断状态和选择 状态:今天第i天,我手里是否有股票,以及我卖出过几次股票. 选择: ...
- 20200710:动态规划复习day03
动态规划复习day03 今天来看股票问题1 题目一:买卖股票的最佳时机 解题思路 首先我们想到的不是动态规划的解法,是一个常规思路:找到后面与当前值的差值最大的那个值,即为我们需要找的卖出的day.因 ...
- 20200715:动态规划复习day06
统计全1子矩阵 题目 思路与算法 代码实现 复杂度分析 题目 思路与算法 题意很好理解,但是本题的动态规划不是常规思路的,你需要很好的理解题意并仔细分析状态与转移关系,才能定义正确的dp数组以及其dp ...
- 20200708:动态规划复习day02
写在前面 继续接着来写今天的动态规划系列 今天带来子序列相关的两道题,一起拓展动态规划的思路 题目一:最长上升子序列 解题思路 不再像昨天一样写我们如何找到状态选择的,直接来确定dp数组及其含义.没有 ...
- 动态规划复习-HDU1081
注意多个测试用例,和poj不一样 注意输出用例结果之间要换行 代码如下: #include int rect[101][101]; int a[101], dp[101]; int n, mx; in ...
- 20200707:动态规划专题之不同路径
动态规划复习day01 动态规划的题目一直是本人的弱项,这周尝试连续7天的动态规划专题,争取做到有的放矢. 不同路径Ⅰ和Ⅱ解析 题目一:不同路径 解题思路 依据动态规划解题的套路思路 确定状态和选择, ...
- NOIP复习篇———贪心
NOIP复习篇---贪心 --------------------------------------------------------------------------------------- ...
- 算法设计与分析考前复习
算法设计与分析考前复习 qiwang的NOJ系统在考前一天崩了,强烈建议开发新OJ 另外,由于以下这些题是我上完数电实验用了下午和晚上时间写的,可能会出一些错. 分治法复习 二分查找 描述 给定一个单 ...
- 中级软件设计师知识总结
文章目录 复习进度 分型 一.面向对象 1 面向对象的概念 面向对象设计原则 2 UML 静态图/结构图包括: 动态图/行为图包括: 3 4 设计模式 设计模式概念 设计模式的分类 创建型模式 结构型 ...
最新文章
- WMI技术介绍和应用——查询本地用户和组
- js002-在HTML中使用JavaScript
- 洛谷 P1024 一元三次方程求解
- 蔡成功贷款警示:没事别玩高利贷
- css3 图片放大缩小闪烁效果
- python3、sqlmap下载与安装教程
- [C指针] 用图表解读C声明:Unscrambling C Declarations by Diagram
- “Python编程及大数据应用”课程教师(厦门)寒假研修班
- jsp页面播放服务器视频
- Hibernate SQL 查询
- 有关EEPROM AT24C02字节写入和页写入
- 如何给光耦输入端限流
- 学计算机用微软笔记本可以吗,当我用上二合一电脑的时候我还是个学生
- Racket GUI,使用message%显示图片
- 简繁体互换工具:opencc
- 为小巨人记一笔,等待明日新星的升起
- Intellij IDEA 2019 英文界面乱码问题解决
- PLATO上线LAAS协议Elephant Swap,用户可借此获得溢价收益
- phpWord设置页码奇偶页不同Footer::EVEN
- Set? set和Set set的区别?
热门文章
- 华为入局 VR 眼镜能让 VR 早普及几年?|CSDN博文精选
- 告别写笔记,AI 实时转写黑科技来了!
- 第二届字节跳动夏令营启动全球报名,图灵奖得主授课
- 蘑菇车联召开战略发布会 为用户提供无缝衔接的“人车生活”
- 程序员快放弃 Android 9.0 吧,10.0 正在来的路上!
- 软件也要歧视大龄程序员吗?
- 身为程序员的唐僧说:只要我不死,就能取到真经!
- 阿里、京东被曝全面“缩招”;YY CEO 身体植入芯片;Oculus 创始人离职 | 极客头条...
- 说要干掉苹果的罗永浩却打起了微软
- 李彦宏:我从未说过百度“All in AI”,这得怪陆奇