You are given an array prices where prices[i] is the price of a given stock on the ith day.
Find the maximum profit you can achieve. You may complete at most two transactions.
Note: You may not engage in multiple transactions simultaneously (i.e., you must sell the stock before you buy again).
Example 1:
Input: prices = [3,3,5,0,0,3,1,4]
Output: 6
Explanation: Buy on day 4 (price = 0) and sell on day 6 (price = 3), profit = 3-0 = 3.
Then buy on day 7 (price = 1) and sell on day 8 (price = 4), profit = 4-1 = 3.
Example 2:
Input: prices = [1,2,3,4,5]
Output: 4
Explanation: Buy on day 1 (price = 1) and sell on day 5 (price = 5), profit = 5-1 = 4.
Note that you cannot buy on day 1, buy on day 2 and sell them later, as you are engaging multiple transactions at the same time. You must sell before buying again.
Example 3:
Input: prices = [7,6,4,3,1]
Output: 0
Explanation: In this case, no transaction is done, i.e. max profit = 0.
Example 4:
Input: prices = [1]
Output: 0
Constraints:
1 <= prices.length <= 1050 <= prices[i] <= 105
解法一:
使用动态规划求解。利用# 188. Best Time to Buy and Sell Stock IV 买卖股票的最佳时间之四通项来求解,k 设置为 2。代码如下:
class Solution {
fun maxProfit(prices: IntArray): Int {
val k = 2
val totalDays = prices.size
var maxProf = 0
if (k >= totalDays) {
for (index in 0 until prices.size - 1) {
if (prices[index + 1] > prices[index]) {
maxProf += prices[index + 1] - prices[index]
}
}
return maxProf
} else {
// f[k, ii] represents the max profit up until prices[ii] (Note: NOT ending with prices[ii]) using at most k transactions.
// f[k, ii] = max(f[k, ii-1], prices[ii] - prices[jj] + f[k-1, jj]) { jj in range of [0, ii-1] }
// = max(f[k, ii-1], prices[ii] + max(f[k-1, jj] - prices[jj]))
// f[0, ii] = 0; 0 times transation makes 0 profit
// f[k, 0] = 0; if there is only one price data point you can't make any money no matter how many times you can trade
val dp = Array(k + 1) { IntArray(size = totalDays, init = { 0 }) }
for (kk in 1..k) {
var tempMax = dp[kk - 1][0] - prices[0]
for (ii in 1 until totalDays) {
dp[kk][ii] = Math.max(dp[kk][ii - 1], tempMax + prices[ii])
tempMax = Math.max(tempMax, dp[kk - 1][ii] - prices[ii])
maxProf = Math.max(dp[kk][ii], maxProf)
}
}
return maxProf
}
}
}