zoukankan      html  css  js  c++  java
  • 188. Best Time to Buy and Sell Stock IV

    You are given an integer array prices where prices[i] is the price of a given stock on the ith day.

    Design an algorithm to find the maximum profit. You may complete at most k transactions.

    Notice that you may not engage in multiple transactions simultaneously (i.e., you must sell the stock before you buy again).

    Example 1:

    Input: k = 2, prices = [2,4,1]
    Output: 2
    Explanation: Buy on day 1 (price = 2) and sell on day 2 (price = 4), profit = 4-2 = 2.
    

    Example 2:

    Input: k = 2, prices = [3,2,6,5,0,3]
    Output: 7
    Explanation: Buy on day 2 (price = 2) and sell on day 3 (price = 6), profit = 6-2 = 4. Then buy on day 5 (price = 0) and sell on day 6 (price = 3), profit = 3-0 = 3.
    

    Constraints:

    • 0 <= k <= 109
    • 0 <= prices.length <= 104
    • 0 <= prices[i] <= 1000

    dp (optimal), time = O(nk), space = O(k)

    class Solution {
        public int maxProfit(int k, int[] prices) {
            int n = prices.length;
            if(n < 2) {
                return 0;
            }
            if(k >= n / 2) {
                int maxProfit = 0;
                for(int i = 1; i < n; i++) {
                    maxProfit += Math.max(0, prices[i] - prices[i - 1]);
                }
                return maxProfit;
            }
            
            int[] local = new int[k + 1];   // local[i]: the max profit on day i, stock must be sold on day i
            int[] global = new int[k + 1]; // global[i]: the max profit on day i
    
            for(int i = 1; i < n; i++) {
                int diff = prices[i] - prices[i - 1];
                for(int j = k; j >= 1; j--) {
                    local[j] = Math.max(global[j - 1] + Math.max(0, diff), local[j] + diff);
                    global[j] = Math.max(global[j], local[j]);
                }
            }
            return global[k];
        }
    }

    dp, time = O(nk), space = O(nk)

    class Solution {
        public int maxProfit(int k, int[] prices) {
            int n = prices.length;
            if(n < 2) {
                return 0;
            }
            if(k >= n / 2) {
                int maxProfit = 0;
                for(int i = 1; i < n; i++) {
                    maxProfit += Math.max(0, prices[i] - prices[i - 1]);
                }
                return maxProfit;
            }
            
            // mustSell[i][j]: the max profit in first i days with at most j transactions, stock must be sold on day i
            // globalBest[i][j]: the max profit in first i days with at most j transactions
            int[][] mustSell = new int[n][k + 1];
            int[][] globalBest = new int[n][k + 1];
            
            for(int i = 1; i < n; i++) {
                int diff = prices[i] - prices[i - 1];
                mustSell[i][0] = 0;
                for(int j = 1; j <= k; j++) {
                    mustSell[i][j] = Math.max(globalBest[i - 1][j - 1] + diff, mustSell[i - 1][j] + diff);
                    globalBest[i][j] = Math.max(globalBest[i - 1][j], mustSell[i][j]);
                }
            }
            return globalBest[n - 1][k];
        }
    }
  • 相关阅读:
    Linux内核网络协议栈优化总纲
    Java实现 蓝桥杯VIP 算法训练 连续正整数的和
    Java实现 蓝桥杯VIP 算法训练 连续正整数的和
    Java实现 蓝桥杯VIP 算法训练 寂寞的数
    Java实现 蓝桥杯VIP 算法训练 寂寞的数
    Java实现 蓝桥杯VIP 算法训练 学做菜
    Java实现 蓝桥杯VIP 算法训练 学做菜
    Java实现 蓝桥杯VIP 算法训练 判断字符位置
    Java实现 蓝桥杯VIP 算法训练 判断字符位置
    Java实现 蓝桥杯VIP 算法训练 链表数据求和操作
  • 原文地址:https://www.cnblogs.com/fatttcat/p/13835998.html
Copyright © 2011-2022 走看看