每日一题算法:2020年7月10日 [最佳买卖股票时机含冷冻期] maxProfit

2020年7月10日 最佳买卖股票时机含冷冻期 maxProfit在这里插入图片描述

默认格式:

class Solution {
    public int maxProfit(int[] prices) {

    }
}

解题思路:

首先,看一看能否使用动态规划的方式来做该题。

第n天获得的最大利益和第n-1天有关系吗?没有,那就没有办法做动态规划。

1,暴力迭代

第1天买入,第2、3、4、5…最后一天卖出,计算出最低收入。

在这里插入图片描述

然后计算第二天买入的最低收入。第二天买入的比第一天买入的收入高
在这里插入图片描述

计算第三天买入的收入
在这里插入图片描述

没有变化,第三天买入的必定比第二天买入的收益低。

第四天买入的也是一样,没有比第一天买入收益高。
在这里插入图片描述

重点第五天买入的,需要加上第3天卖出的最高收益。第5天买入,之前完全足够第2天买入第三天卖出第4天休眠,所以,我们加上前面3天最高的收益,再计算之后可能得到的最高的收益。
在这里插入图片描述
最后得到最高值23。

时间复杂度n2,空间复杂度n

实现代码:

初版:

在这里插入图片描述

public int maxProfit(int[] prices) {

    int pricesLen=prices.length;

    int[] max=new int[pricesLen];

    for(int i=0;i<pricesLen;i++){

        int oldVal=0;
        if (i-2>=0){
            oldVal=max[i-2];
        }
        for (int j=i;j<pricesLen;j++){

                max[j]=Integer.max(max[j],oldVal+prices[j]-prices[i]);
        }
    }

    int res=0;

    for (int i=0;i<pricesLen;i++){
        if (max[i]>res)
            res=max[i];
    }
    return res;
}

错误原因分析:

6164302

第二天买入收益最高,分别为5,3,2,1,-1,1 但是当第6天购买的时候,不应该计算的时第4天当天的最高收益,而是前4天可能获得的最高收益

改正后:

在这里插入图片描述

可以优化,在每一个元素遍历的时候,判断当前元素是否比前一个小,如果比前一个大,那么就跳过判断

    public int maxProfit(int[] prices) {

        int pricesLen=prices.length;
        if (pricesLen==0)
            return 0;
        int[] max=new int[pricesLen];

        int res=0;
        for(int i=0;i<pricesLen;i++){

            int oldVal=0;
            if (i-2>=0){
                oldVal=max[i-2];
            }
            for (int j=i+1;j<pricesLen;j++){

                    max[j]=Integer.max(max[j],oldVal+prices[j]-prices[i]);
                    max[j]=Integer.max(max[j],max[j-1] );
            }
        }

        return max[pricesLen-1];
    }

时间是缩短了,但是还是不够优化,没有达标。算了不写了

在这里插入图片描述

©️2020 CSDN 皮肤主题: 游动-白 设计师: 上身试试 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值