- 921. Minimum Add to Make Parentheses Valid 使括号有效的最少添加
- 915. Partition Array into Disjoint Intervals 分割数组
- 932. Beautiful Array 漂亮数组
- 940. Distinct Subsequences II 不同的子序列 II
题目地址:https://leetcode.com/problems/best-time-to-buy-and-sell-stock-with-cooldown/description/
Sayyou 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:
Example:
Input: [1,2,3,0,2]
Output: 3
Explanation: transactions = [buy, sell, cooldown, buy, sell]
股票交易的原则是必须先买然后再卖,在买入之前必须至少休息一天。求最后能得到的最大收益。
感觉自己DP的能力还是太弱,越是这样越需要迎难而上。
这个题和714. Best Time to Buy and Sell Stock with Transaction Feeopen in new window比较像。做题方法都是使用了两个数组:
1、 cash该天结束手里没有股票的情况下,已经获得的最大收益;
2、 hold该天结束手里有股票的情况下,已经获得的最大收益;
状态转移方程式这样的:
cash[i]代表的是手里没有股票的收益,这种可能性是今天卖了或者啥也没干。max(昨天手里有股票的收益+今天卖股票的收益,昨天手里没有股票的收益), 即max(sell[i - 1], hold[i - 1] + prices[i]); hold[i]代表的是手里有股票的收益,这种可能性是今天买了股票或者啥也没干,今天买股票必须昨天休息。所以为max(今天买股票是前天卖掉股票的收益-今天股票的价格,昨天手里有股票的收益)。即max(hold[i - 1], sell[i - 2] - prices[i])。
另外需要注意的是,题目说的是昨天卖了股票的话今天不能买,对于开始的第一天,不可能有卖股票的行为,所以需要做个判断。
该算法的时间复杂度是O(n),空间复杂度是O(n)。
代码如下:
class Solution:
def maxProfit(self, prices):
"""
:type prices: List[int]
:rtype: int
"""
if not prices: return 0
sell = [0] * len(prices)
hold = [0] * len(prices)
hold[0] = -prices[0]
for i in range(1, len(prices)):
sell[i] = max(sell[i - 1], hold[i - 1] + prices[i])
hold[i] = max(hold[i - 1], (sell[i - 2] if i >= 2 else 0) - prices[i])
return sell[-1]
1 2 3 4 5 6 7 8 9 10 11 12 13 14
如果使用O(1)的空间复杂度,那么就可以写成下面这样:
class Solution:
def maxProfit(self, prices):
"""
:type prices: List[int]
:rtype: int
"""
if not prices: return 0
prev_sell = 0
curr_sell = 0
hold = -prices[0]
for i in range(1, len(prices)):
temp = curr_sell
curr_sell = max(curr_sell, hold + prices[i])
hold = max(hold, (prev_sell if i >= 2 else 0) - prices[i])
prev_sell = temp
return curr_sell
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
C++解法如下:
class Solution {
public:
int maxProfit(vector<int>& prices) {
const int N = prices.size();
if (N == 0) return 0;
// cash[i] means the max profit if I dont have stock on day i
vector<int> cash(N, 0);
// stock[i] means the max profit if I have stock on day i
vector<int> stock(N, 0);
stock[0] = -prices[0];
for (int i = 1; i < N; i++) {
cash[i] = max(stock[i - 1] + prices[i], cash[i - 1]);
stock[i] = max((i >= 2 ? cash[i - 2] : 0) - prices[i], stock[i - 1]);
}
return cash[N - 1];
}
};
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
参考资料:
https://soulmachine.gitbooks.io/algorithm-essentials/java/dp/best-time-to-buy-and-sell-stock-with-cooldown.html
DDKK.COM 弟弟快看-教程,程序员编程资料站,版权归原作者所有
本文经作者:负雪明烛 授权发布,任何组织或个人未经作者授权不得转发
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 8 年前。 Improve th
我正在尝试弄清楚如何在单击“立即购买”按钮时使用单选按钮从表单中提取数据。我知道在 react 中你可以获取值并设置状态,但我正在尝试使用一个 ajax 调用,我不是 100% 了解如何设置它。我尝试
我注意到我的一位 friend 在使用它。 » Buy for $1,691 如果我使用它,我感觉没有任何变化。 » Buy for $1,691 那么谁能解释一下两者的区别是什么? 只是想知道为什么
有一个经典的面试问题,利润最大化,一次交易买股票,允许n次交易和k次交易。 有人问我类似的问题,但有一个扭曲约束:您可以多次购买股票(任何一天不超过一个单位),但您不能在卖出股票后购买。 这有一个你只
我在窗体上有两个按钮,其中一个按钮包含货币代码(EUR,USD,GBP,CHF等),另一个按钮-交易方向(买入或卖出)。还有一些实用程序通过文本来识别按钮。 为了识别带有货币的按钮,我使用了正则表达式
我发现这段代码可以在 iOS 9 上使用 swift 2 执行应用内购买。我的 IAP(应用内购买)将位于表格中。它将显示为一条提醒消息,您可以在其中点击购买 或取消。如果您点击购买,则会显示来自 A
对于产品系列页面 ( https://bloomthis.co/collections/on-demand-blooms ),当每个产品悬停在上面时,会显示替代图像。备用图片是产品页面中添加的最后一张
这个问题在这里已经有了答案: 关闭 10 年前。
我正在开发一个允许人们在IOS应用程序中提出某种问题的应用程序,在后端,有人(人类)可以回答这些问题。显然,答案有些延迟(10分钟-1小时)。 我可以为此使用In App Purchase模式(消耗品
我希望使用 ES6、react、react-redux 和您的 js-buy-sdk api 构建一个电子商务 Web 应用程序。我的问题是,从shopify获取所有产品并将它们放入商店后,我似乎没有
我正在使用 Shopify 的 BUY SDK 创建自定义店面。 import Client from 'shopify-buy' const client = Client.buildClient(
我正在尝试在应用程序购买中使用 Android。我使用的是官方文档和 util(Base64 等)。我正在使用托管 项目。我在哪里以及如何处理已经购买的元素? (我将 bool 值设置为 true 并
我正在使用 shopify buy SDK 创建自定义店面: 我在尝试添加订单项时遇到错误 下面的示例代码都可以正常工作,但遇到“addLineItems”方法时除外:我已经检查了参数,它们似乎没问题
我目前有应用内购买“恢复”按钮, 它确实工作,但本质上它要求用户在整个过程中“购买”升级(就像普通的应用程序内一样)我担心这会 a) 被苹果拒绝b) 吓唬用户,让他们认为他们再次付费 有什么办法可以改
我的教授指示我们制作一个类似星巴克的菜单,用户可以在其中继续输入订单直到完成。我在循环中显示了菜单,但无法将输入的订单相加并显示总数。 #include using namespace std; i
过去 15 天试图解决 paypal 问题,在 PayPal 升级后,我的客户在付款时遇到问题,前几天它有时工作正常但现在只显示错误。 在我选择要购买的商品并单击“立即购买”按钮后,paypal 显示
我在网站上工作,我需要与 Payza 集成。从我读到的“立即购买”按钮看起来像这样: 这是不安全的。 Payza 是否提供任何 API 来保护我的按钮(例如 P
我正在使用 Paypal 的“立即购买”按钮,我很困惑为什么它不起作用(我以前做过)。 我在 Paypal 上创建了一个“立即购买”按钮,并取消选中“在 Paypal 上保存此按钮”- 因此它没有托管
我有一个集成了 Facebook SDK 的 iOS 应用程序,并且我一直在运行 Facebook 的按安装付费事件。 最近尝试为另一个具有相同 SDK 的应用程序设置此功能,但我在设置 Facebo
我目前正在使用 Shopify Buy Button . 在大多数情况下,我只是复制并粘贴了嵌入代码,并没有做太多更改。 我有一些产品需要购买 5 件或更多的所述商品。 典型的添加到购物袋按钮只添加一
我是一名优秀的程序员,十分优秀!