您的位置:首页 > 职场人生

leetcode之Best Time to Buy and Sell Stock III 问题

2017-07-04 20:45 363 查看
问题描述:

Say you have an array for which the ith element is the price of a given stock on dayi.

Design an algorithm to find the maximum profit. You may complete at mosttwo transactions.(发现这些问题变化了啥没?)

Note:

You may not engage in multiple transactions at the same time (ie, you must sell the stock before you buy again).

问题来源:Best Time to Buy and Sell Stock III (详细地址:https://leetcode.com/problems/best-time-to-buy-and-sell-stock-iii/#/description)

思路:和前面的两个问题Best Time to Buy and Sell Stock链接 和 Best Time to Buy and Sell StockII 链接 变化的只是交易的数量,所以说这类问题可以总结为一类问题,其实都是DP问题的变种。将这道题一般化,可以转化为进行k次交易的情况,然后我们这只需要将k特殊化(k
= 2),说实话,我刚开始看到这道题知道是动态规划的问题,但是我也不知道如何进行递推,在这参考了一篇博客(参考博客),写的还是非常好的。

在这它采用了两个重要的数组,分别是local[]和global[]数组,表示局部最优和全局最优,有点极值和最值的意思了哈,下面我也把它对这两个数组的意思摘过来:

local[i][j]:截止到第i天,总共进行了j次交易的最大利润是多少,但是第i天正好进行了第j次交易才打到的最大利润;

global[i][j]:截止到第i天,总共进行了j次交易的最大利润是多少。

给出的递推公式,我在这也再补充解释一下:
                                                 local[i][j] = max(global[i  - 1][j - 1] + max(0, diff), local[i - 1][j] + diff);
根据咱们的定义出发,可以想到能出现两种情况,前面i - 1天进行的j - 1次交易加上这次的交易额不是正好凑够i天的j次交易嘛,当然这里考虑的第i天的第j次交易要是比0小,那我们就不采纳它了,直接加上一个0,所以才会出现max(0, diff)的情况了。最后取它们的最大值就满足题意的利益最大化了。
 相比较local[i][j]来讲,global[i][j]就要简单好理解很多了,因此,它的递推式子也容易得到了:
                                                 global[i][j] = max(global[i - 1][j], local[i][j])
在这也补充解释一下: i天总共进行了j次交易,它可以是前i - 1天就已经交易了j次了,也可以是直到进行了第i天的第j次 (前面i - 1天交易了j - 1次,就差最后一次交易了)才达到利润最大化。同样,必须取它们之间较大的那一个。
代码:




体会:自己还需要加强dp方面问题的分析能力,递推公式分析能力还是比较薄弱啊!多刷刷dp方面的问题,希望自己下次回头看的时候能够明白的更多吧,能有更深层次的理解吧,加油!

                                           
           
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java leetcode 算法 面试