LeetCode题解:188. Best Time to Buy and Sell Stock IV
来源:互联网 发布:超牛手机数据恢复软件 编辑:程序博客网 时间:2024/06/16 22:56
Say you have an array for which the ith element is the price of a given stock on day i.
Design an algorithm to find the maximum profit. You may complete at most k transactions.
Note:
You may not engage in multiple transactions at the same time (ie, you must sell the stock before you buy again).
这个是可以进行K次交易,和前面写的这个两次交易的博客类似。
定义K组变量buy[k] 和sell[k]分别表示第k次买能得到的总最大利润和第k次卖能得到的总最大利润。
for(每一天的价格price)
buy[i] = max{buy[i],sell[i-1]-price}
sell[i] = max{sell[i],buy[i]+price}
class Solution { public int maxProfit(int k, int[] prices) { if (k == 0 || prices == null || prices.length == 0 || prices.length == 1) return 0; int[] buy = new int[k + 1], sell = new int[k + 1]; Arrays.fill(buy, Integer.MIN_VALUE); for (int price : prices) { for (int i = 1; i <= k; i++) { buy[i] = Integer.max(buy[i], sell[i - 1] - price); sell[i] = Integer.max(sell[i], buy[i] + price); } } return sell[k]; }}
sell[k]控制着最后的结果,最后的sell[k]就是可以获得的最大的利润。
但是上述的代码会超时,从上一篇写到的博客中最后提过的问题,可以知道当k>n/2时,就可以用贪心法得到最大的利润。最后的代码调整如下:
class Solution { public int maxProfit(int k, int[] prices) { if (k == 0 || prices == null || prices.length == 0 || prices.length == 1) return 0; if (k >= prices.length / 2) { return getMaxProfit(prices); } int[] buy = new int[k + 1], sell = new int[k + 1]; Arrays.fill(buy, Integer.MIN_VALUE); for (int price : prices) { for (int i = 1; i <= k; i++) { buy[i] = Integer.max(buy[i], sell[i - 1] - price); sell[i] = Integer.max(sell[i], buy[i] + price); } } return sell[k]; } private int getMaxProfit(int[] prices) { int sum = 0; for (int i = 0; i < prices.length - 1; i++) { if (prices[i] < prices[i + 1]) sum += prices[i + 1] - prices[i]; } return sum; }}
循环的含义是,对每一个价格,如果是第i次的买或者卖,看是否能够更新第i次的买和卖的最大利润。
阅读全文
0 0
- [leetcode] 188.Best Time to Buy and Sell Stock IV
- [leetcode] 188.Best Time to Buy and Sell Stock IV
- [leetcode] 188. Best Time to Buy and Sell Stock IV
- [LeetCode] 188. Best Time to Buy and Sell Stock IV
- Leetcode 188. Best Time to Buy and Sell Stock IV
- 【leetcode】188. Best Time to Buy and Sell Stock IV
- LeetCode 188. Best Time to Buy and Sell Stock IV
- Leetcode 188. Best Time to Buy and Sell Stock IV
- Leetcode 188. Best Time to Buy and Sell Stock IV
- Leetcode 188. Best Time to Buy and Sell Stock IV
- LeetCode 188. Best Time to Buy and Sell Stock IV
- LeetCode题解:188. Best Time to Buy and Sell Stock IV
- [LeetCode] Best Time to Buy and Sell Stock IV
- leetcode: Best Time to Buy and Sell Stock IV
- LeetCode(188) Best Time to Buy and Sell Stock IV
- Best Time to Buy and Sell Stock IV -- leetcode
- Best Time to Buy and Sell Stock IV--LeetCode
- LeetCode : Best Time to Buy and Sell Stock III & IV
- Til the Cows Come Home POJ
- 哈尔滨理工大学第七届程序设计竞赛决赛 B 幸运大奖
- 一个炫酷大屏展示页的打造过程
- java的整数类型,浮点类型,字符类型
- py3爬虫项目
- LeetCode题解:188. Best Time to Buy and Sell Stock IV
- Hibernate中持久化对象的三种状态
- 三个线程轮流执行顺序打印ABC(三):使用Lock实现
- poj 2175 费用流+消圈
- Visual Studio 2017 配置OpenCV 3.3教程
- 数据结构实验之查找二:平衡二叉树
- 剑指offer — 数字在排序数组中出现的次数
- 【考研】第十五周总结
- LTE x-RNTI (1)