- -最多可以买两次。。。最大收益。。。
第一想法,枚举分割线,然后按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; } };