1957

无聊蛋疼的1957写的低端博客
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

[leetcode]Best Time to Buy and Sell Stock III

Posted on 2013-08-26 14:05  1957  阅读(348)  评论(0编辑  收藏  举报

- -最多可以买两次。。。最大收益。。。

第一想法,枚举分割线,然后按I那种做法来做,算两边的最大收益。

= =时间复杂度O(n^2)

其实可以这么想啦..

从刚才的枚举分割线的想法,那么我就用两个数组记录

从左到右的最大收益,另外一个是从右往左的最大收益.

那么还是枚举分割线哒!但是实践复杂度就是O(n)啦.

 

class Solution {
public:
    void calc(vector<int>&data , vector<int>&f){
        int minx = 0;
        int ans = 0;
        f[0] = 0;
        for(int i = 1 ; i < data.size() ; i++){
            if(data[i] < data[minx]) minx = i;
            int tmp = data[i] - data[minx];
            ans = max (ans , tmp);
            f[i] = ans;
        }
    }
    void calc1(vector<int>&data , vector<int>&f){
        int maxx = 0;
        int ans = 0;
        f[0] = 0;
        for(int i = 1 ; i < data.size() ; i++){
            if(data[i] > data[maxx]) maxx = i;
            int tmp = data[maxx] - data[i];
            ans = max(ans , tmp);
            f[i] = ans;
        }
    }
    int maxProfit(vector<int> &prices) {
        // Start typing your C/C++ solution below
        // DO NOT write int main() function
        if(prices.size() <= 1) return 0;
        vector<int> f(prices.size());
        vector<int> h(prices.size());
        calc(prices , f);
        reverse(prices.begin() , prices.end());
        calc1(prices , h);
        reverse(h.begin() , h.end());
        int ans = f[f.size() - 1];
        
        for(int i = 0 ; i < f.size() - 1 ; i ++){
            ans = max(ans , f[i] + h[i+1]);
        }
        return ans;
        
    }
};