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).
题意不难,第一反应,暴力枚举
for i1 in (0,n):
for i2 in (i1,n):
for i3 in (i2,n):
for i4 in *i3,n):
算利益,求最大值
复杂度n^4,最垃圾的了
使用DP,可以把俩次过程拆开来看,比如可以以第二次购买的时间为分界点,分成俩部分,求每部分的最大利益,加起来。这样时间复杂度就是n^2了.
for i in (2,n):
max(0,i-1)+max(i,n)是否为最大值.
当然还有n的复杂度。
记录四个变量,第一次购买的时间,第一次卖出的时间,第二次购买的时间,第二次卖出的时间。
public class Solution {
public int maxProfit(int[] prices) {
int hold1 = Integer.MIN_VALUE, hold2 = Integer.MIN_VALUE;
int release1 = 0, release2 = 0;
for(int i:prices){ // Assume we only have 0 money at first
release2 = Math.max(release2, hold2+i); // The maximum if we've just sold 2nd stock so far.
hold2 = Math.max(hold2, release1-i); // The maximum if we've just buy 2nd stock so far.
release1 = Math.max(release1, hold1+i); // The maximum if we've just sold 1nd stock so far.
hold1 = Math.max(hold1, -i); // The maximum if we've just buy 1st stock so far.
}
return release2; ///Since release1 is initiated as 0, so release2 will always higher than release1.
}
}