题意
有一个数组price,price[ i ] 是第 i 天的股票价格。你的手上最多持有一支股票,且最多进行两次交易,求最大利润。
思路
求出从第一天到第 i 天之内,买卖一次获得的最大收益,再求出从第 i+1 天到最后一天之内,买卖一次获得的最大收益。然后 i 从 0 到 n-1 扫一遍就行了。时间复杂度是O(n)。
可能是坑的地方:你可以不买股票,因此利润的最小值是0。如果数组为空,直接返回0,不然会RE。
python代码
class Solution:
def maxProfit(self, prices):
"""
:type prices: List[int]
:rtype: int
"""
n = len(prices)
if n == 0:
return 0
'''分别记录前面若干天之内和后面若干天之内,一次买卖的最大收益'''
left = [0] * n
right = [0] * n
minp = prices[0]
maxp = prices[n-1]
for i in range(1,n,1):
'''minp表示从第0天到第i天的最低价格'''
minp = min(minp, prices[i])
left[i] = max(left[i-1], prices[i]-minp)
for i in range(n-2,-1,-1):
'''maxp表示从最后一天到第i天的最低价格'''
maxp = max(maxp, prices[i])
right[i] = max(right[i+1], maxp-prices[i])
'''left[n-1]表示最多进行一次买卖获得的最大收益'''
ans = left[n-1]
for i in range(0,n-1):
ans = max(ans, left[i]+right[i+1])
return ans
C++代码
#include<algorithm>
#include<vector>
using namespace std;
class Solution
{
public:
int maxProfit(vector<int> &prices)
{
if(prices.empty() || prices.size() == 1)
return 0;
int ans=0;
int n=prices.size();
vector<int> left(n+10,0);
vector<int> right(n+10,0);
int minp=prices[0];
left[0]=0;
for(int i=1;i<n;i++)
{
minp=min(minp,prices[i]);
left[i]=max(left[i-1],prices[i]-minp);
}
int maxp=prices[n-1];
right[n-1]=0;
for(int i=n-2;i>=0;i--)
{
maxp=max(maxp,prices[i]);
right[i]=max(right[i+1],maxp-prices[i]);
}
ans=max(left[n-1],right[0]);
for(int i=0;i<n-1;i++)
ans=max(ans,left[i]+right[i+1]);
return ans;
}
};