Best Time to Buy and Sell Stock
原题链接Best Time to Buy and Sell Stock
给定一个价格序列prices,其中prices[i]代表第i天商品的价格,商家需要在某一天买入,然后在之后的某一天出售,计算可以获得的最大利润
本质就是计算 prices[i]−prices[j] 的最大值,要求 i>j
假设已经直到最后结果的最大值位置i(prices[i]),只需要减去最小值即可,那么就需要直到最小值是多少,本题中当从左到右遍历时,完全可以随着遍历进度的增加记录最小值
代码如下
class Solution {
public:
int maxProfit(vector<int>& prices) {
if(prices.empty()) return 0;
/* 记录目前位置找到的最小值 */
int minPrices = prices[0];
/* 记录最大差值 */
int maxProfit = 0;
for(int i = 1; i < prices.size(); ++i)
{
/* 以prices[i]作为最大值,尝试计算差值 */
maxProfit = std::max(maxProfit, prices[i] - minPrices);
/* 尝试更新最小值 */
minPrices = std::min(minPrices, prices[i]);
}
return maxProfit;
}
};
当然也可以遍历两次求解,第一次对于每个位置的值,计算它的右侧比它大的最大值,第二次对于每个位置,计算右侧的最大值与自己的差,更新最大差值,求出结果
代码如下
class Solution {
public:
int maxProfit(vector<int>& prices) {
int n = prices.size();
vector<int> dp(n + 1, 0);
/* 计算prices[i]右侧的最大值,包括自己 */
for(int i = n - 1; i >= 0; --i)
dp[i] = std::max(dp[i + 1], prices[i]);
int maxProfit = 0;
/* 右侧最大值 - 自身 = 最大差值 */
for(int i = 0; i < n; ++i)
maxProfit = std::max(maxProfit, dp[i] - prices[i]);
return maxProfit;
}
};
Best Time to Buy and Sell Stock II
原题链接Best Time to Buy