题目链接:https://leetcode.com/problems/best-time-to-buy-and-sell-stock-iii/
思路:
方法一:
这次要求只能交易两次,我的思路就是从前往后遍历一遍,保存 0~i的最大利润,
然后用另一个数组从后向前,保存i~n-1的最大利润,然后找出对应同一个i的相加值的最大的。
minPrice表示从第0天到第i天中的最低价格。
A[0]=0。(初始状态)
A[1]=max(prices[1]-prices[0],A[0])
A[2]=max(prices[2]-minPrice,A[1])
.....
即A[i]=max(price[i]-minPrice,A[i-1]).
A[0]=0
另外一次扫描从数组后向前扫描,定义B[i]表示从第i天到最后一天n-1能赚的最大数目的钱。
maxPrice表示第i天到n-1天的最高价格。
B[n-1]=0。(初始状态)
B[n-2]=max(maxPrice-prices[n-2],B[n-1])
.....
即B[i]=max(maxPrice-prices[i],B[i+1])
那么以第i天为分割点能赚的最多数目的钱为A[i]+B[i]
问题的解为max{A[i]+B[i]}。0<=i<=n-1。
时间复杂度是O(N),空间复杂度是O(N)。
AC 1ms 99.6% Java:
class Solution {
public int maxProfit(int[] prices) {
int ans=0;
int n=prices.length;
if(n==0)
return 0;
int[] A=new int[n];
int[] B=new int[n];
A[0]=0;
int minPrice=prices[0];
int maxPrice=prices[n-1];
for(int i=1;i<n;i++){
A[i]=Math.max(A[i-1],prices[i]-minPrice);
minPrice=Math.min(minPrice,prices[i]);
}
B[n-1]=0;
for(int i=n-2;i>=0;i--){
B[i]=Math.max(maxPrice-prices[i],B[i+1]);
maxPrice=Math.max(maxPrice,prices[i]);
ans=Math.max(ans,A[i]+B[i]);
}
return ans;
}
}