package LeetCode_188 /** * 188. Best Time to Buy and Sell Stock IV * https://leetcode.com/problems/best-time-to-buy-and-sell-stock-iv/description/ * * Say you have an array for which the i-th 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). Example 1: Input: [2,4,1], k = 2 Output: 2 Explanation: Buy on day 1 (price = 2) and sell on day 2 (price = 4), profit = 4-2 = 2. Example 2: Input: [3,2,6,5,0,3], k = 2 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. * */ class Solution { /* * Time complexity:O(nk), Space complexity:O(k) * */ fun maxProfit(k: Int, prices: IntArray): Int { val n = prices.size if (n <= 1 || k <= 0) { return 0 } var profit = 0 //check the k, if large than n, will be Memory Limit Exceeded //so do below like Leetcode_122 if (k > n / 2) { for (i in 0 until prices.size - 1) { if (prices[i + 1] > prices[i]) { profit += prices[i + 1] - prices[i] } } return profit } val buys = IntArray(k, { Int.MIN_VALUE }) val sells = IntArray(k) for (i in prices.indices) { for (j in 0 until k) { val price = if (j == 0) -prices[i] else (sells[j - 1] - prices[i]) buys[j] = Math.max(buys[j], price) sells[j] = Math.max(sells[j], buys[j] + prices[i]) } } return sells[k - 1] } }