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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_44076848/article/details/102574192

flag

软件学院大三党,每天一道算法题,第七天

题目介绍

给定一个整数数组,其中第 i 个元素代表了第 i 天的股票价格 。​

设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票):

你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。
示例:

输入: [1,2,3,0,2]
输出: 3
解释: 对应的交易状态为: [买入, 卖出, 冷冻期, 买入, 卖出]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-with-cooldown

思路

此题展现出来的维度有三个。
思路是先降维,将买、卖、冷冻,三个维度降维成两个维度:持有股票和未持有股票。
持有股票:今天买入和之前买入但未卖出
未持有:今天卖出和冷冻期
所以传递式为:
hold[i]=max(hold[i-1],notHold[i-2]-prices[i]); 意思是
①当前持有的股票的最大收益是昨天持有的股票(今天并未有任何操作)
②之前卖出的最大收益-今天买入的(i-2的意思是今天买入的话,昨天就应该是冷冻期)。

notHold[i]=max(notHold[i-1],hold[i-1]+prices[i]);
①当前未持有股票最大收益是昨天未持有的最大收益(今天无操作)
②昨天持有股票,今天卖了。

关键代码

    public static int maxProfit(int []prices){
        int n=prices.length;//炒股总天数
        if(n==0)
            return 0;
        int []hold=new int[n];//保存持有股票当天的最大收益
        hold[0]=-prices[0];//第一天持有股票即买了第一天的股票

        int [] notHold=new int[n];//保存未持有股票当天的最大收益
        for(int i=1;i<n;i++){
            if(i>=2)
                hold[i]=Math.max(hold[i-1],notHold[i-2]-prices[i]);
            else
                hold[i]=Math.max(hold[i-1],-prices[i]);
            notHold[i]=Math.max(notHold[i-1],hold[i-1]+prices[i]);
        }
        return notHold[n-1];

    }

总结

降维的思路非常好,简化了好多不必要的步骤

状态机方法解决通用股票问题
https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-with-cooldown/solution/yi-ge-fang-fa-tuan-mie-6-dao-gu-piao-wen-ti-by-lab/

猜你喜欢

转载自blog.csdn.net/weixin_44076848/article/details/102574192