
算是困难题里比较容易写的题目了,只是思路可能有些新奇(好吧后来发现只有我的思路如此新奇)。
我的做法是根据先前的经验,先从前往后遍历一次,记录每遍历到一个位置的最大收益,接着从后往前遍历,同样找最大收益,看取哪个相加收益最大就行。
这种做法最大缺点就是只有只能买两次能用,要是能买三次四次就用不了了。
cpp
class Solution {
public:
int maxProfit(vector<int>& prices) {
int forward[100001];
int maxx=0;
int minn=100000;
for(int i=0;i<prices.size();i++){
maxx=max(prices[i]-minn,maxx);
minn=min(prices[i],minn);
forward[i]=maxx;
}
int result;
maxx=0;minn=100000;
for(int i=prices.size()-1;i>=0;i--){
minn=min(prices[i]-maxx,minn);
maxx=max(prices[i],maxx);
result=max(result,forward[i]-minn);
}
return result;
}
};
答案用的是动态规划,用时和消耗空间差不多,也更容易理解一些,非常好解析:
cpp
class Solution {
public:
int maxProfit(vector<int>& prices) {
int buy1=-prices[0],sell1=0,buy2=-prices[0],sell2=0;
for(int i=1;i<prices.size();i++){
buy1=max(buy1,-prices[i]);
sell1=max(sell1,prices[i]+buy1);
buy2=max(buy2,sell1-prices[i]);
sell2=max(sell2,prices[i]+buy2);
}
return sell2;
}
};