题目链接:best-time-to-buy-and-sell-stock-iii
import java.util.Arrays;
/**
*
* Say you have an array for which the ith element is the price of a given stock on day i.
* Design an algorithm to find the maximum profit. You may complete at most two transactions.
* Note:
* You may not engage in multiple transactions at the same time (ie, you must sell the stock before you buy again).
*
*/
public class BestTimetoBuyAndSellStockIII {
// 设状态 f (i),表示区间 [0, i](0 ≤ i ≤ n − 1) 的最大利润
// 状态 g(i),表示区间 [i, n − 1](0 ≤ i ≤ n − 1) 的最大利润
// 则最终答案为 max{f(i) + g(i)},0 ≤ i ≤ n − 1。
// 允许在一天内买进又卖出,相当于不交易,因为题目的规定是最多两次,而不是一定要两次。
// 198 / 198 test cases passed.
// Status: Accepted
// Runtime: 251 ms
// Submitted: 0 minutes ago
public int maxProfit(int[] prices) {
int len = prices.length;
if(len <= 1) return 0;
int f[] = new int[len];
int g[] = new int[len];
Arrays.fill(f, 0);
Arrays.fill(g, 0);
//区间 [0, i]
int minPrice = prices[0];
for(int i = 1; i < len; i++) {
f[i] = Math.max(f[i - 1], prices[i] - minPrice);
minPrice = Math.min(minPrice, prices[i]);
}
//区间 [i, n − 1](0 ≤ i ≤ n − 1)
int maxPrice = prices[len - 1];
for(int i = len - 2; i >= 0; i--) {
g[i] = Math.max(g[i + 1], maxPrice - prices[i]);
maxPrice = Math.max(maxPrice, prices[i]);
}
int max = 0;
for (int i = 0; i < len; i++)
max = Math.max(max, f[i] + g[i]);
return max;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
}
}