(121)买卖股票的最佳时期
我的解法:
数组dif用来记录相邻两日买入卖出所得的差额;
sum累加dif中的元素,可以累加负数,只要确保sum值不为负数,sum值为负数时代表亏,res用来记录过程中可获取的最大利润。
class Solution {
public:
int maxProfit(vector<int>& prices) {
vector<int> dif(prices.size() - 1);
for(int i = 0; i < prices.size() - 1; ++i){
dif[i] = prices[i + 1] - prices[i];
}
int sum = 0,res = 0;
for(int i = 0; i < dif.size(); ++i){
if(sum + dif[i] < 0){
sum = 0;
continue;
}
sum += dif[i];
res = max(res,sum);
}
return res;
}
};
改进解法:
在for循环内部直接用while循环累加sum,一次实现多步累加;
一轮for循环的内部是在计算第i天买入能获得的最大利润。
class Solution {
public:
int maxProfit(vector<int>& prices) {
vector<int> benefit(prices.size(),0);
for(int i = 1; i < prices.size(); ++i){
benefit[i] = prices[i] - prices[i - 1];
}
int res = 0;
// 考虑每一天买入股票所能获得的最大利润sum
for(int i = 0,k = i; i < prices.size(); ++i){
int sum = 0;
while(k < prices.size()){
sum += benefit[k++];
if(sum < 0) break;
res = max(res,sum);
}
}
return res;
}
};