You are given an integer array
Find the maximum profit you can achieve. You may complete at most
Note: 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 <= 100 0 <= prices.length <= 1000 0 <= prices[i] <= 1000
Best Time to Buy and Sell Stock 系列中的 hard 難題
也是得用 DP 解
dp[i][j] : max profit from at most i transaction using prices [0..j]
因為一定要遵守先買後賣的原則,所以一開始 currProfit 都會是 -prices[0]
其餘部分,可以看註解
kotlin(參考資料)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class Solution { | |
fun maxProfit(k: Int, prices: IntArray): Int { | |
return if(prices.isEmpty()) { | |
0 | |
} else { | |
// dp[i][j]: max profit from at most i transactions using prices[0..j] | |
val dp = Array(k+1) { IntArray(prices.size) {0}} | |
var currProfit: Int // local max profit | |
for(i in 1..k) { | |
currProfit = -prices[0] // you need to buy before selling | |
for(j in 1..prices.lastIndex) { | |
// max(do nothing, sell today), sell won't increase transaction count | |
dp[i][j] = Math.max(dp[i][j-1], currProfit + prices[j]) | |
// max(currProfit, buy today), this value is used for the next loop | |
// we need to buy before selling, so we check here should we buy today | |
// we need to use dp[i-1][j-1] because buy a stock increase the transaction count | |
currProfit = Math.max(currProfit, dp[i-1][j-1] - prices[j]) | |
} | |
} | |
dp[k][prices.lastIndex] | |
} | |
} | |
} |
沒有留言:
張貼留言