Best Time to Buy and Sell Stock with Cooldown

题目等级:Medium

题目描述:

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:

Input: [1,2,3,0,2]
Output: 3
Explanation: transactions = [buy, sell, cooldown, buy, sell]

  题意:给定一个整数数组,其中第 i 个元素代表了第 i 天的股票价格 。设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易,但是有两个条件:再次买入之前必须卖出、卖出后第二天无法买入,有一天的冷冻期。


解题思路(动态规划):

  又开始买卖股票了。。。

  前面我们依次处理了买卖股票的四道题目:分别限制交易一次、交易无数次、交易两次、交易k次。这里是无数次情况的一个变形,加入了一个冷冻期。

  解题方法同样还是动态规划,这里没有交易次数的限制,所以我们定义状态比较方便,对于动态规划,这里每一天是一个阶段,每一阶段的决策就是:每天决定买、卖还是冷冻,而每一天有两个状态:手里持有股票、手里没有股票(包括了冷冻期这种情况)。

  所以可以定义两个状态变量:

  sell[i]:表示在第i天结束后手里没有股票的情况下,获得的最大收益。

  hold[i]:表示在第i天结束后手里仍然持有股票的情况下获得的最大收益。

  那么,对于这两个状态,如果当天结束时仍然持有股票,那么有两种可能:(1)今天刚买的,那么说明前一天必须冷冻,再往前一天结束时手里没有股票,即hold[i]=sell[i-2]-prices[i]. (2)以前就买了,今天啥也没干,也没买也没卖,换句话说就是前一天结束的时候手里已经有了,即:hold[i]=hold[i-1]

  如果当天结束的时候手里没有股票,那么说明也有两种可能:(1)今天刚卖了, 也就是说前一天结束的时候手里还是持有股票的,所以:sell[i]=hold[i-1]+prices[i].(2)以前就卖了,今天啥也没干,那说明前一天结束的时候手里已经没有股票了,所以:sell[i]=sell[i-1].

  综合起来,就可以得到递推关系式:

	hold[i]=max(sell[i-2]-prices[i],hold[i-1])
sell[i]=max(hold[i-1]+prices[i],sell[i-1])

  另外还有一点需要注意的是:初始条件,第一天的时候不可能卖出,也不可能冷冻,第一天一定会买入,这实际上还是贪心思想的一种体现,第一天可以买一定是会买的,在处理不限次数的交易时,已经证明了这种贪心思想的正确性,所以sell[0]=0,而hold[0]=-prices[0].

  最后,根据以上分析给出以下代码:

class Solution {
public int maxProfit(int[] prices) {
if(prices==null || prices.length==0)
return 0;
int len=prices.length;
int[] sell=new int[len];
int[] hold=new int[len];
sell[0]=0;
hold[0]=-prices[0];
for(int i=1;i<len;i++){
sell[i]=Math.max(sell[i-1],hold[i-1]+prices[i]);
hold[i]=Math.max(hold[i-1],(i>1?sell[i-2]:0)-prices[i]); //这里i-2注意防止越界
}
return sell[len-1];
}
}

  时间复杂度:O(n),空间复杂度:O(2n)

【LeetCode】309、最佳买卖股票时机含冷冻期的更多相关文章

  1. Java实现 LeetCode 309 最佳买卖股票时机含冷冻期

    309. 最佳买卖股票时机含冷冻期 给定一个整数数组,其中第 i 个元素代表了第 i 天的股票价格 .​ 设计一个算法计算出最大利润.在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股 ...

  2. Leetcode 309.最佳买卖股票时机含冷冻期

    最佳买卖股票时机含冷冻期 给定一个整数数组,其中第 i 个元素代表了第 i 天的股票价格.​ 设计一个算法计算出最大利润.在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票): 你不 ...

  3. 手撕代码:leetcode 309最佳买卖股票时机含冷冻期

    转载于:https://segmentfault.com/a/1190000014746613 给定一个整数数组,其中第i个元素代表了第i天的股票价格. 设计一个算法计算出最大利润.在满足以下约束条件 ...

  4. 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. 买卖股票 ...

  5. leecode 309. 最佳买卖股票时机含冷冻期

    /***** //sell[i]表示截至第i天,最后一个操作是卖时的最大收益: //buy[i]表示截至第i天,最后一个操作是买时的最大收益: //cool[i]表示截至第i天,最后一个操作是冷冻期时 ...

  6. [Leetcode] 第309题 最佳买卖股票时机含冷冻期

    一.题目描述 给定一个整数数组,其中第 i 个元素代表了第 i 天的股票价格 .​ 设计一个算法计算出最大利润.在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票): 你不能同时参与 ...

  7. leetcode 最佳买卖股票时机含冷冻期

    这道题算是股票问题的变体之一,主要在于不限制交易次数而存在冷冻期,所以我们需要对我们的dp数组进行改变,第一维是指第几天,第二维是指是否持有股票,在这里因为不限制交易次数k,所以并未涉及第三维度. 同 ...

  8. [Swift]LeetCode309. 最佳买卖股票时机含冷冻期 | 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 ...

  9. leetcode题解-122买卖股票的最佳时期

    题目 leetcode题解-122.买卖股票的最佳时机:https://www.yanbinghu.com/2019/03/14/30893.html 题目详情 给定一个数组,它的第 i 个元素是一支 ...

随机推荐

  1. 使用IDEA搭建一个Spring + AOP (权限管理 ) + Spring MVC + Mybatis的Web项目 (零配置文件)

    前言: 除了mybatis 不是零配置,有些还是有xml的配置文件在里面的. 注解是Spring的一个构建的一个重要手段,减少写配置文件,下面解释一下一些要用到的注解: @Configuration  ...

  2. linux下使用 TC 对服务器进行流量控制

    tc 介绍 在linux中,tc 有二种控制方法 CBQ 和 HTB.HTB 是设计用来替换 CBQ 的.HTB比CBQ更加灵活,但是CPU 开销也更大,通常高速的链路会使用CBQ,一般而言HTB使用 ...

  3. 第十一章 前端开发-html

    第十一章 前端开发-html 1.1.0 html:超文本标记语言 html特征:(HyperText Markup Language) 对换行的空格不敏感 空白折叠 标签:有称为标记 双闭合标签 & ...

  4. npoi 导入

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="CusImport.aspx ...

  5. [深度学习] 各种下载深度学习数据集方法(In python)

    一.使用urllib下载cifar-10数据集,并读取再存为图片(TensorFlow v1.14.0) # -*- coding:utf-8 -*- __author__ = 'Leo.Z' imp ...

  6. jquery设置css属性几种方式

    用css()方法返回元素的样式属性 $("div").css("padding-left")); 用css()设置样式 $("div").c ...

  7. pgadmin4 csrf错误导致docker-compose postgres服务下线

    docker-compse up 启动的前台服务, 过一会就自动停止 检查半天,发现是pgadmin4没安装正确不断报400 和 csrf error 然后pgadmin4为啥报这个, 因为pytho ...

  8. HGOI20190707 题解

    Problem A 钢铁侠的诞生 现在有$n$个数字$a_i \leq 10^9 $,然后取出$m$个数字,保证合法. 从小到大输出剩余的$n-m$个数字. 对于100%的数据$m\leq n \le ...

  9. python脚本中selenium启动浏览器报错os.path.basename(self.path), self.start_error_message) selenium.common.excep

    在python脚本中,使用selenium启动浏览器报错,原因是未安装浏览器驱动,报错内容如下: # -*- coding:utf-8 -*-from selenium import webdrive ...

  10. jsPDF生成pdf文件和中文编码

    jsPDF的简单使用以及中文编码问题的解决 文中js通过CDN引入,若是为了加载时间最好下载至本地. jsPDF的使用 jsPDF简介 jsPDF 是一个基于 HTML5 的客户端解决方案,用于在客户 ...