Best Time to Buy and Sell Stock III @leetcode

!由于题意是两次交易,而且这两次买卖不能再时间上重叠,是两个独立的问题,联想到分而治之的策略,将{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等于放弃自我。

哦了,反思完毕,睡觉,我可不想脖子疼:)

posted @ 2013-11-13 01:09  沙茶面  阅读(166)  评论(0编辑  收藏  举报