买股票的最佳时机Ⅲ------题解报告

 题目:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

这种寻找最优解的问题,马上想到的就是动态规划和贪心。

我们创建一个dp的二维数组,用0表示手持现金,1表示手持股票。

初始化dp的值,然后遍历更新即可:

 public int maxProfit(int[] prices) {
        int [][]dp= new int[prices.length][2];
        dp[0][0]=0;
        dp[0][1]=-prices[0];
        for(int i=1;i<prices.length;i++)
        {
            dp[i][0]=Math.max(dp[i-1][0],dp[i-1][1]+prices[i]);
            dp[i][1]=Math.max(dp[i-1][1],dp[i-1][0]-prices[i]);
        }
        return dp[prices.length-1][0];
    }

但是这样空间复杂度和时间都不算完美,还有更好的办法吗?

上面说道,除了动态规划,还有一个贪心也经常也被用来寻找最优解。

我们来仔细分析一下题目,其实我们就是要寻找多个[l,r]的区间,让这些区间的prices[r]-prices[l]相加为最大值。

在每个[l,r]区间中,都满足下面的式子:

prices[r]-prices[l]=prices[r]-prices[r-1]+prices[r-1]-prices[r-2]...+prices[l]-prices[l]

那么对于每一个我们要寻找的区间的prices[r]-prices[l]来说,就等于相邻元素之差之和。

我们来举个列子:

输入:1,2,3,4,5

根据我们上面的式子来说sum=2-1+3-2+4-3+5-4=4;

但实际上,我们更具买股票的最佳时机Ⅰ可以很轻易的得知实际过程应该是第一天买进,最后一天卖出sum=5-1=4;

讲到这里,大家应该理解了,上代码:

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

时间复杂度为O(n),空间复杂度为O(1)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值