Problem
Notes
这题在121题的基础上,把买卖规则改为了可以多次买卖,不过买第二次时必须要先卖掉第一次,即不能同时进行多笔交易。
我们想,即然不能同时多笔交易,那么最后我们得出的解,一定是把原数组分成了若干个不相交的若干个子段,那么要使总的利润最大化,那么我们应该使每段利润都最大,那么我们找到所有非递减的子段,用处于该子段的头的价格买入,尾价格卖出,那么就能得到最大利润了。
时间复杂度o(n)
Codes
class Solution {
public:
int maxProfit(vector<int>& prices) {
int n=prices.size();
if(n<=1) return 0;
int ans=0;
int nowprice=prices[0];
for(int i=1;i<n;++i)
{
if(prices[i]<prices[i-1])
{
ans+=prices[i-1]-nowprice;
nowprice=prices[i];
}
}
if(prices[n-1]>=prices[n-2])
ans+=prices[n-1]-nowprice;
return ans;
}
};