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

 题目:力扣(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

买股票的最佳时机Ⅲ------题解报告_第1张图片

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

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

我们来仔细分析一下题目,其实我们就是要寻找多个[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

买股票的最佳时机Ⅲ------题解报告_第2张图片

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

你可能感兴趣的:(题解,java,算法,数据结构)