123. 买卖股票的最佳时机 III

给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。

设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。

注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-iii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

import java.util.Arrays;

class Solution {

    private int all(int[] prices) {
        int ret = 0;
        for (int i = 1; i < prices.length; ++i) {
            ret += Math.max(0, prices[i] - prices[i - 1]);
        }
        return ret;
    }

    private int maxProfit(int[] prices, int k) {
        if (prices.length / 2 <= k) {
            return all(prices);
        }
        int n = prices.length;
        int[] hold = new int[k + 1];
        int[] nohold = new int[k + 1];
        Arrays.fill(hold, Integer.MIN_VALUE / 2);
        hold[0] = -prices[0];

        for (int i = 1; i < n; ++i) {
            int pre = hold[0];
            hold[0] = Math.max(hold[0], -prices[i]);
            for (int j = 1; j <= k; ++j) {
                int t = hold[j];
                hold[j] = Math.max(hold[j], nohold[j] - prices[i]);
                nohold[j] = Math.max(nohold[j], pre + prices[i]);
                pre = t;
            }
        }
        return Arrays.stream(nohold).max().getAsInt();
    }

    public int maxProfit(int[] prices) {
        return maxProfit(prices, 2);
    }
}
posted @ 2021-12-18 22:33  Tianyiya  阅读(29)  评论(0)    收藏  举报