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