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).
这道题有I、II的不同之处在于只能买进两次,而且必须是买进、卖出、再买进、再卖出这样,手中不能超过一只股票。
将I的解法变为从前往后,从后往前遍历两遍,寻找到i的 0...i的最大值以及i...length - 1的最大值,将这两个值相加,找到最大利润。
Source
public class Solution {
public int maxProfit(int[] prices) {
if(prices.length <= 1) return 0;
int min = prices[0];
int[] a = new int[prices.length];
for(int i = 1; i < prices.length; i++){
min = Math.min(min, prices[i]); //p[0]...p[i]当前数组最小值
a[i] = Math.max(a[i - 1], prices[i] - min); //a[i]存储从0..i的利益最大值
}
int max = prices[prices.length - 1];
int[] b = new int[prices.length];
for(int i = prices.length - 2; i >= 0; i--){
max = Math.max(prices[i], max);
b[i] = Math.max(max - prices[i], b[i + 1]);
}
int maxp = 0;
for(int i = 0; i < prices.length; i++){
maxp = Math.max(maxp, a[i] + b[i]); //a[i]是从前往后数,b[i]是从后往前数
//所以可以有效避免出现前一次还没卖出后一次就买入的情况,a[i]是从0到i,b[i]是从i到length - 1
}
return maxp;
}
}
Test
public static void main(String[] args){
int[] prices = {1,2,3,6,3};
System.out.println(new Solution().maxProfit(prices));
}