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);
    }
}
    心之所向,素履以往 生如逆旅,一苇以航

 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号