出现的bugs:
(1)由两个if的来计算序列的值,讨论了>和<而忽略的=的情况,结果对应的值被默认初始化
(2)引用初始化。在两个函数里的两个参数引用初始化了同一个vector,结果是第二个引用参数由于iterator的更改而全部失效,也就是说所有的结果都恢复到了初始化的状态。
思维的卡壳:
(1)计算逆序的最大值时出错
class Solution {
public:
vector<int> maxlr(vector<int> &prices) {
vector<int> res(prices.size());
if(prices.size()==0) return res;
int min=prices[0];res[0]=0;
int maxp=0;
for(int i=1; i<prices.size();++i){
if(prices[i]<=min) {res[i]=res[i-1]; min=prices[i];}
if(prices[i]>min){
maxp=max(maxp,prices[i]-min);
res[i]=maxp;
}
}
return res;
}
vector<int> maxrl(vector<int> &prices) {
vector<int> res(prices.size());
if(prices.size()==0) return res;
int maxv=prices.back();res.back()=0;
int maxp=0;
for(int i=prices.size()-2; i>=0;--i){
if(prices[i]>=maxv) {res[i]=res[i+1]; maxv=prices[i];}
if(prices[i]<maxv){
maxp=max(maxp,maxv-prices[i]);
res[i]=maxp;
}
}
return res;
}
int maxProfit(vector<int> &prices) {
if(prices.size()==0) return 0;
vector<int> lr= maxlr(prices);//cout<<lr.back()<<endl;
vector<int> rl= maxrl(prices);//cout<<rl.front()<<endl;
int maxv=lr.back();
for(int i=2;i<prices.size()-1;++i){
//int tmp=maxp(prices,0,i)+maxp(prices,i,prices.size());
int tmp=lr[i-1]+rl[i];
if(tmp>maxv) maxv=tmp;
}
return maxv;
}
};
容易理解的暴力法如下:
class Solution {
public:
int maxp(vector<int> &prices,int beg,int end) {
if(prices.size()==0) return 0;
int min=INT_MAX;
int maxp=0;
for(int i=beg ; i<end;++i){
if(prices[i]<min) min=prices[i];
if(prices[i]>min){
maxp=max(maxp,prices[i]-min);
}
}
return maxp;
}
int maxProfit(vector<int> &prices) {
if(prices.size()==0) return 0;
int maxv=maxp(prices,0,prices.size());
for(int i=2;i<prices.size()-1;++i){
int tmp=maxp(prices,0,i)+maxp(prices,i,prices.size());
if(tmp>maxv) maxv=tmp;
}
return maxv;
}
};