• 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];
        }
    }
  • 相关阅读:
    MySQL中的char与varchar详解
    有关PHPstorm的git环境的配置和git密钥的生成总结
    PHP开发中常用的字符串操作函数
    PHP 二维数组排序函数的应用 array_multisort()
    大龄程序员的出路在哪里
    近期面试总结(PHP后端开发工程师)(部分笔试题)
    B-Tree目录和Hash索引的区别
    curl、fopen和file_get_contents区别
    什么是OAuth授权
    SEO 统计算法
  • 原文地址:https://www.cnblogs.com/fatttcat/p/13835998.html
Copyright © 2020-2023  润新知