[LeetCode]Best Time to Buy and Sell Stock with Cooldown

其实遇到这种容易陷入到具体某一种细节情况的问题的时候,就要有意识,这个题很有可能是DP相关问题。类似的题目还包括编辑距离、最长公共子序列等。

求解这类问题时(DP)就是两点:1、状态转移方程;2、Corner case


只是在这道题中状态转移方程比较不容易看出。


在你获取利润的时候一定是在卖出股票的时候(买入没有利润),那么本天结束时的利润只有两种状态,1、本天没有进行操作;2、本天卖出了股票。而其中本天没有操作的利润最大值是前一天卖出和未操作两者之中较大的那个,本天卖出了股票的利润有三种情况,1、昨天卖了,然后昨天再买入今天卖出,相当于昨天没卖今天卖了;2、昨天没操作,今天买今天卖;3、昨天没操作,昨天买昨天卖。分析可知1、3情况下3一定小于1,如果3>1此时昨天不能买,因为前天有卖出。


public class Solution {
    public int maxProfit(int[] prices) {
        int p1 = 0,p2 = 0;
        for(int i = 0;i < prices.length-1;i++){
            int temp = p1;
            p1 = Math.max(p1+prices[i+1]-prices[i],p2);
            p2 = Math.max(temp,p2);
        }
        return Math.max(p1,p2);
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值