leetcode之Best Time to Buy and Sell Stock III 问题
来源:互联网 发布:17年机械行业数据 编辑:程序博客网 时间:2024/06/15 09:12
问题描述:
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方面的问题,希望自己下次回头看的时候能够明白的更多吧,能有更深层次的理解吧,加油!
- LeetCode之Best Time to Buy and Sell Stock III
- leetcode之Best Time to Buy and Sell Stock III
- LeetCode之Best Time to Buy and Sell Stock III
- leetcode之Best Time to Buy and Sell Stock III 问题
- leetcode之Best Time to Buy and Sell Stock问题
- LeetCode Best Time to Buy and Sell Stock III
- LeetCode Best Time to Buy and Sell Stock III
- [Leetcode] Best Time to Buy and Sell Stock III
- leetcode 16: Best Time to Buy and Sell Stock III
- LeetCode Best Time to Buy and Sell Stock III
- [LeetCode] Best Time to Buy and Sell Stock III
- leetcode 62: Best Time to Buy and Sell Stock III
- [LeetCode] Best Time to Buy and Sell Stock III
- 【leetcode】Best Time to Buy and Sell Stock III
- LeetCode - Best Time to Buy and Sell Stock III
- [LeetCode]Best Time to Buy and Sell Stock III
- LeetCode: Best Time to Buy and Sell Stock III
- [Leetcode]Best Time to Buy and Sell Stock III
- 内存管理---非连续存储分配
- java权限管理知识总结
- 判断某一年是否是闰年
- Java 用重载的一些建议
- POJ 2619 Delta-wave 笔记
- leetcode之Best Time to Buy and Sell Stock III 问题
- 2.SpringMVC_RequesMapping
- Linux下ffmpeg的安装过程
- Java面试-关于线程方面的知识迷惑
- 03.10 Xshell优化与远程连接故障排查
- 简易在线留言板(下)——树洞留言板
- PAT+乙1005. 继续(3n+1)猜想
- 堆的简述以及堆排序
- 剑指offer | 训练题53:字流中第一个不重复的字符