题目省略233
这是一个牺牲空间复杂度来换取时间复杂度的例子。
买卖股票的题目在LeetCode中有一整个系列(有很多博客在写,很容易搜到)。这道题目是规定最多买卖两次,而第121道题要求只能买一次。我们可以从121中获得一部分思路。
121的思路:遍历数组,一方面计算当前的最优收益,与最高收益做比较;另一方面记录股票的最低价,便于与日后做比较。
代码如下:
class Solution {
public:
int maxProfit(vector<int>& prices) {
int length = prices.size();
if(length<2)
return 0;
int curmin = prices[0];
int maxProfit = 0;
for(int i=1; i<length; i++){
maxProfit = max(maxProfit, prices[i]-curmin);
curmin = min(curmin, prices[i]);
}
return maxProfit;
}
};
回到123题,要求最多交易两次。比较容易想到把原数组分为两个部分,0-pivot和pivot-prices.size()-1,分别对两个子数组求交易一次的最大收益,再求和。pivot从0遍历到末尾要一次循环,内部要计算子数组的最大收益是O(n)的复杂度,则该算法的复杂度为O(n^2)。代码如下:
class Solution {
public:
int maxSubArray(vector<int>& prices, int begin, int end){
int curMin = prices[begin];
if(end-begin<1)
return 0;
int maxProfit = 0;
for(int i=begin+1; i<=end; i++){
maxProfit=max(maxProfit, prices[i]-curMin);
curMin = min(curMin, prices[i]);
}
return maxProfit;
}
int maxProfit(vector<int>& prices) {
if(prices.size()<2)
return 0;
int maxProfit = 0;
for(int pivot=0; pivot<prices.size()-1; pivot++)
maxProfit = max(maxProfit, maxSubArray(prices, 0, pivot)+maxSubArray(prices, pivot, prices.size()-1));
return maxProfit;
}
};
很不幸,Time Limit Exceeded
仔细想一下,我们遍历的次数太多了,能不能减少遍历次数,开辟一些空间把结果保存起来最后处理?
用一个数组former[]来记录0-pivot天的最大收益,另一个数组later[]记录pivot-末尾的最大收益,用两次遍历可以分别计算出这两个数组。再最后遍历一次这两个数组,找出对应元素和的最大值。
代码如下:
class Solution {
public:
int maxProfit(vector<int>& prices) {
int length = prices.size();
if (length<2){
return 0;
}
vector<int> former(length,0);
vector<int> later(length,0);
int curMin = prices[0];
int curProfit = 0;
for(int i=1; i<length; i++){
curProfit = max(curProfit, prices[i]-curMin);
curMin = min(curMin, prices[i]);
former[i] = curProfit;
}
int curMax = prices[length-1];
curProfit = 0;
for(int i = length-2; i>=0; i--){
curProfit = max(curProfit, curMax-prices[i]);
curMax = max(curMax, prices[i]);
later[i] = curProfit;
}
int maxProfit = 0;
for(int i=0; i<length; i++)
maxProfit = max(maxProfit, former[i]+later[i]);
return maxProfit;
}
};
划重点:用空间复杂度换取时间复杂度,记录中间结果,减少遍历次数。
796




被折叠的 条评论
为什么被折叠?



