这三道题目思路相近,可以看成都是通过动态规划实现,不过 II 其实应该算是贪心,只要能够赚钱就进行交易,而 I 和 III 对交易次数进行了限制,后者可以看成是前者的推广,通过对前者使用二分的方法,将一个数组看成两个按前者的方法求解即可。I 的求解方法是通过记录前面的最小值,并不断判断差价,最终找到最大差价的
Best Time to Buy and Sell Stock I
class Solution {
public:
int maxProfit(vector<int> &prices) {
if(prices.size()<=1)return 0;
int result=0;
int begin=prices[0],end=prices[0];
for(int i=1;i<prices.size();i++){
if(prices[i]-begin>result)
result=prices[i]-begin;
if(begin>prices[i])begin=prices[i];
}
return result;
}
};
Best Time to Buy and Sell Stock II
class Solution {
public:
int maxProfit(vector<int> &prices) {
int sum=0;
for(int i=prices.size()-1;i>0;i--){//tanxin
prices[i]-=prices[i-1];
if(prices[i]>0)sum+=prices[i];
}
return sum;
}
};
Best Time to Buy and Sell Stock III
class Solution {
public:
int maxProfit(vector<int> &prices) {
int ans=0;
if(prices.size()<=1)return 0;
int tres=0;
int len=prices.size();
int maxl[len],maxr[len];
memset(maxl,0,sizeof(maxl));
memset(maxr,0,sizeof(maxr));
int begin=prices[0];
for(int i=1;i<len;i++){
if(begin>prices[i])begin=prices[i];
if(prices[i]-begin>ans)ans=prices[i]-begin;
maxl[i]=ans;
}
ans=0;
begin=prices[len-1];
for(int i=len-2;i>=0;i--){
if(begin-prices[i]>ans)
ans=begin-prices[i];
if(begin<prices[i])begin=prices[i];
maxr[i]=ans;
}
for(int i=1;i<len;i++){
if(ans<maxl[i-1]+maxr[i])
ans=maxl[i]+maxr[i];
}
return ans;
}
};