首页 > 学院 > 开发设计 > 正文

123. Best Time to Buy and Sell Stock III

2019-11-08 19:45:30
字体:
来源:转载
供稿:网友

有趣的一题,一开始是以为用区间dp,dpij表示从i到j的最大值,结果发现有bug,然后通过最后求解想发到方法。 final = max(final, left[i] + right[i]); 其实我们只需要求出从左右两边算起来的最大值,不用把区间中的每一个小区间的最大值都求出来,所有就用了第一题的方法,从左边算一次,再从右边算一次(右边算的优点不一样,需要维护最大的数然后就sum,左边是维护最小的数再维护最大的sum)

class Solution {public: int maxPRofit(vector<int>& prices) { if(prices.size() == 0) return 0; int n = prices.size(); int sum = 0, minn = prices[0]; vector<int>left(n, 0); vector<int>right(n, 0); for(int i = 1; i < n; ++ i){ if(prices[i] < minn) minn = prices[i]; else{ if(prices[i] - minn > sum) sum = prices[i] - minn; } left[i] = sum; } sum = 0; int maxx = prices[n - 1]; for(int i = n - 2; i >= 0; -- i){ if(prices[i] > maxx) maxx = prices[i]; else{ if(maxx - prices[i] > sum) sum = maxx - prices[i]; } right[i] = sum; } int final = 0; for(int i = 0; i < n - 1; ++ i){ final = max(final, left[i] + right[i]); } return final; }};
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表