!由于题意是两次交易,而且这两次买卖不能再时间上重叠,是两个独立的问题,联想到分而治之的策略,将{0,1,...,i,...,n-1,n}的问题拆分为求{0,1,..,i}和{i+1,...,n-1,n}两个子问题,而这两个子问题又刚好是Best Time to Buy and Sell Stock I的解题思路。
1 int maxProfit(vector<int> &prices) { 2 // IMPORTANT: Please reset any member data you declared, as 3 // the same Solution instance will be reused for each test case. 4 if(prices.size() <= 1) 5 return 0; 6 int i,min; 7 vector<int> pre; 8 int n = prices.size(); 9 pre.resize(n); 10 pre[0] = 0; 11 min = prices[0]; 12 //create the feature list for pre 13 for(i=1;i<n;++i) 14 { 15 if(prices[i]<min) min = prices[i]; 16 if(prices[i] - min > pre[i-1]) 17 pre[i] = prices[i] - min; 18 else 19 pre[i] = pre[i-1]; 20 } 21 22 int res,max,finalres; 23 res = finalres = 0; 24 max = prices[n-1]; 25 for(i = n-2;i>=0 ;--i) 26 { 27 if(prices[i]>max) max = prices[i]; 28 if(max - prices[i] > res) 29 res = max - prices[i]; 30 if(finalres < pre[i] + res ) 31 finalres = pre[i] + res; 32 } 33 return finalres; 34 }
#这题TLE了多次,开始我TM已经向分而治之的方向考虑了,结果由于Best Time to Buy and Sell Stock I的解题思路使用的是特征向量的方式,并不适用与本题拆分成小问题后的治理,导致TLE。因为我建立了一个二维特征向量,来计算最佳投资,貌似OJ提供的数据以万记,二维显然不行,我太面了。后来考虑这题无非是找出4个点(A,B,C,D)(ABCD按时间顺序A<B<C<D),求h(A,B)+h(C,D)最大为多少?(h(A,B)表示这两个时间点的差值,当然prices(B)>prices(A)),而结果的这四个点一定满足:A,C为谷值,B,D为峰值,然后我就建了两个vector,分别保存谷值和峰值的时间点(需要O(n)),然后...然后就没有然后了。再然后,我就无耻地谷歌了。
=不能再这么安奈不住渴望ac的跃进了(跃进这词好像不符合我的年龄,不过这个词太精确了),过度渴望ac会走火入魔,忘却算法本身的乐趣。按cc的说法:
1.这题不太会,很可能满足了进步的条件,应该好好把握;
2.多思考几天,过早google等于放弃自我。
哦了,反思完毕,睡觉,我可不想脖子疼:)