方法一
方法一是《算法导论》上最大子数组一节介绍的方法。虽然也是线性时间,但是在构造与前一天的价格差这个步骤多花了时间。
方法二
方法二是题解里介绍的方法。如《算法导论》上所讲,不一定是最低价买入,也不一定是最高价卖出。想到的方法是穷举买入卖出的时间
(
i
,
j
)
(i,j)
(i,j),但时间复杂度是
O
(
n
)
O(n)
O(n)。有一点可以得出,如果确定了卖出时间
j
j
j,那么要使利润最大,时间点
i
i
i 对应的买入价格一定是时间点
j
j
j 前最低的买入价格。如此我们可以穷举
j
j
j,遍历的过程中顺带记录
j
j
j 前最低的价格。如果
j
j
j 是当前最小的价格了,那么利润肯定为负,就不做比较了。
实现代码如下:
class Solution {
public:
int maxProfit(vector<int>& prices)
{
if (prices.size() == 0)
return 0;
int max = 0;
int min = prices[0];
for (int i = 1; i < prices.size(); i++)
{
if (prices[i] <= min)
min = prices[i];
else
{
if (prices[i] - min > max)
max = prices[i] - min;
}
}
return max;
}
};