Best Time to Buy and Sell Stock with Cooldown
Say you have an array for which the ith element is the price of a given stock on day i.
Design an algorithm to find the maximum profit. You may complete as many transactions as you like (ie, buy one and sell one share of the stock multiple times) with the following restrictions:
- You may not engage in multiple transactions at the same time (ie, you must sell the stock before you buy again).
- After you sell your stock, you cannot buy stock on next day. (ie, cooldown 1 day)
Example:
prices = [1, 2, 3, 0, 2]
maxProfit = 3
transactions = [buy, sell, cooldown, buy, sell] 分析:
因为当前的选择对后面的选择会产生影响,我们可以倒着来分析。
我们用maximumProfit[i]来表示从i 到 length - 1 可以获取的最大profit. 怎么计算maximumProfit[i]呢?那么对于i来讲,最坏情况是maximumProfit[i] = maximumProfit[i + 1].
然后我们把price[i]作为当前最低价,如果后面发现更高的价格price[j],我们就做出更新。
if (j < length - 2) {
maximumProfit[i] = Math.max(prices[j] - low + maximumProfit[j + 2], maximumProfit[i]);
} else {
maximumProfit[i] = Math.max(prices[j] - low, maximumProfit[i]);
}
public int maxProfit(int[] prices) {
if (prices == null || prices.length <= )
return ;
int length = prices.length;
int[] maximumProfit = new int[length];
maximumProfit[length - ] = ;
maximumProfit[length - ] = Math.max(, prices[length - ] - prices[length - ]);
for (int i = length - ; i >= ; i--) {
maximumProfit[i] = maximumProfit[i + ];
int low = prices[i];
for (int j = i + ; j < length; j++) {
if (prices[j] > low) {
if (j < length - ) {
maximumProfit[i] = Math.max(prices[j] - low + maximumProfit[j + ], maximumProfit[i]);
} else {
maximumProfit[i] = Math.max(prices[j] - low, maximumProfit[i]);
}
} else {
low = prices[j];
}
}
}
return maximumProfit[];
}
很明显,时间总复杂度为O(n^2).
另一个方法:
Analysis: https://discuss.leetcode.com/topic/30431/easiest-java-solution-with-explanations
1. Define States
To represent the decision at index i:
buy[i]: Max profit till index i. The series of transaction is ending with a buy.sell[i]: Max profit till index i. The series of transaction is ending with a sell.
To clarify:
- Till index
i, the buy / sell action must happen and must be the last action. It may not happen at indexi. It may happen ati - 1, i - 2, ... 0. - In the end
n - 1, returnsell[n - 1]. Apparently we cannot finally end up with a buy. In that case, we would rather take a rest atn - 1. - For special case no transaction at all, classify it as
sell[i], so that in the end, we can still returnsell[n - 1]. Thanks @alex153 @kennethliaoke @anshu2.
2. Define Recursion
buy[i]: To make a decision whether to buy ati, we either take a rest, by just using the old decision ati - 1, or sell at/beforei - 2, then buy ati, We cannot sell ati - 1, then buy ati, because of cooldown.sell[i]: To make a decision whether to sell ati, we either take a rest, by just using the old decision ati - 1, or buy at/beforei - 1, then sell ati.
So we get the following formula:
buy[i] = Math.max(buy[i - 1], sell[i - 2] - prices[i]);
sell[i] = Math.max(sell[i - 1], buy[i - 1] + prices[i]);
3. Optimize to O(1) Space
DP solution only depending on i - 1 and i - 2 can be optimized using O(1) space.
- Let
b2, b1, b0representbuy[i - 2], buy[i - 1], buy[i] - Let
s2, s1, s0representsell[i - 2], sell[i - 1], sell[i]
Then arrays turn into Fibonacci like recursion:
b0 = Math.max(b1, s2 - prices[i]);
s0 = Math.max(s1, b1 + prices[i]);
4. Write Code in 5 Minutes
First we define the initial states at i = 0:
- We can buy. The max profit at
i = 0ending with a buy is-prices[0]. - We cannot sell. The max profit at
i = 0ending with a sell is0.
public int maxProfit(int[] prices) {
if(prices == null || prices.length <= ) return ;
int b0 = -prices[], b1 = b0;
int s0 = , s1 = , s2 = ;
for(int i = ; i < prices.length; i++) {
b0 = Math.max(b1, s2 - prices[i]);
s0 = Math.max(s1, b1 + prices[i]);
b1 = b0; s2 = s1; s1 = s0;
}
return s0;
}
Best Time to Buy and Sell Stock with Cooldown的更多相关文章
- leetcode 121. Best Time to Buy and Sell Stock 、122.Best Time to Buy and Sell Stock II 、309. Best Time to Buy and Sell Stock with Cooldown
121. Best Time to Buy and Sell Stock 题目的要求是只买卖一次,买的价格越低,卖的价格越高,肯定收益就越大 遍历整个数组,维护一个当前位置之前最低的买入价格,然后每次 ...
- Leetcode之动态规划(DP)专题-309. 最佳买卖股票时机含冷冻期(Best Time to Buy and Sell Stock with Cooldown)
Leetcode之动态规划(DP)专题-309. 最佳买卖股票时机含冷冻期(Best Time to Buy and Sell Stock with Cooldown) 股票问题: 121. 买卖股票 ...
- [LeetCode] Best Time to Buy and Sell Stock with Cooldown 买股票的最佳时间含冷冻期
Say you have an array for which the ith element is the price of a given stock on day i. Design an al ...
- [LeetCode] 309. Best Time to Buy and Sell Stock with Cooldown 买卖股票的最佳时间有冷却期
Say you have an array for which the ith element is the price of a given stock on day i. Design an al ...
- 【LeetCode】309. Best Time to Buy and Sell Stock with Cooldown 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 动态规划 日期 题目地址:https://leetc ...
- LeetCode Best Time to Buy and Sell Stock with Cooldown
原题链接在这里:https://leetcode.com/problems/best-time-to-buy-and-sell-stock-with-cooldown/ 题目: Say you hav ...
- 121. 122. 123. 188. Best Time to Buy and Sell Stock *HARD* 309. Best Time to Buy and Sell Stock with Cooldown -- 买卖股票
121. Say you have an array for which the ith element is the price of a given stock on day i. If you ...
- 309. Best Time to Buy and Sell Stock with Cooldown
题目: Say you have an array for which the ith element is the price of a given stock on day i. Design a ...
- 解题报告Best Time to Buy and Sell Stock with Cooldown
题目 Say you have an array for which the ith element is the price of a given stock on day i. Design an ...
随机推荐
- OWIN support for the Web API 2 and MVC 5 integrations in Autofac
Currently, in the both the Web API and MVC frameworks, dependency injection support does not come in ...
- APP抓链接工具(Fiddler版)
1.下载Fiddler源代码: http://pan.baidu.com/s/1hqEUK0O 2.修改如下源代码: 3.运行截图:
- Ajax load html page
jQuery ajax - load() 方法 jQuery Ajax 参考手册 实例 使用 AJAX 请求来改变 div 元素的文本: $("button").click(fun ...
- 在Centos上安装RabbitMQ流程(转)
在Centos上安装RabbitMQ流程------------------------ 1. 需求 由于项目中要用到消息队列,经过ActiveMQ与RabbitMQ的比较,最终选择了RabbbitM ...
- FIFO学习心得
1,名字.FIFO=First in first out. 2,特点.顺序读入,顺序读出,先入先出. 3,用途.数据缓冲.使两个数据传输速率不一样的设备相匹配. 4,参数. ①,THE WIDTH和T ...
- Block 及注意事项
block 概念 block 是 C 语言的 是一种数据类型,可以当作参数传递 是一组预先准备好的代码,在需要的时候执行 block 的注意事项 (1)block 在实现时就会对它引用到的它所在方法中 ...
- linux程序设计1
a.out 的意思是 assembler output,即汇编输出. C语言的头文件一般位于 /usr/include/ 目录下,而依赖于特定 Linux 版本的头文件通常可在目录 /usr/incl ...
- nginx TCP 代理& windows傻瓜式安装
一.下载nginx Windows http://nginx.org/en/download.html 二.解压到目录 三.进入目录并start nginx.exe即可启动 cd d:/java/ng ...
- 今天<s:hidden>突然能用了
曾经好几个作业中都想要用<s:hidden>隐形传值,一直没有成功. 今天放弃使用了,竟然成功了. 我放弃使用居然成功了,原来只要设置好getter和setter之后就不用管了,只要变量名 ...
- ThinkPHP3.2.3 安装教程
本文以 Windows 平台为例 安装前准备:Windows操作系统的电脑,php编程环境(配置好了Apache.MySql.php).推荐wampserver. 待安 ...