题目:
给定一个数组 prices
,它的第 i
个元素 prices[i]
表示一支给定股票第 i
天的价格。
你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。
返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0
。
思路:利润,也就是前后两点的最大差值
最简单的办法是把最后一个点之前的每一个点都当成买入点,依次算买入点与买入点后各点的差值,求出最大利润,缺点是时间复杂度太高
也许有人会简单的认为算出最低点和最高点就可以了,但是仔细想一下,显然不可以,原因就在于股票并不是单调递增的,它有涨有跌,所以当最高点在最低点前面时,仅仅算出最低点与其后局部最高点的差值或者算出最高点与其前局部最低点的方法是不正确的
那我们应该怎么做呢?
问题复杂就要简化问题
把整段股票价格线分成几段,求各段的最大利润,最后求整体最大利润
怎么分呢?
以第一点为第一段的起点,水平画线,再次碰到k线之前为一段
此时,起点就是整段的局部最低点,起点之后的各点都可以作为卖出点,各求利润然后遇到更大的覆盖就行了;找到下一个起点的方法就是找到下一个比当前起点更低的点
代码:
class Solution {
public:
int merge(vector<int>& price) {
int buy = 0, max_ = 0;
int i = 0;
while (i<price.size())
{
if (price[i] > price[buy])
{
max_ = (price[i] - price[buy] > max_) ? price[i] - price[buy] : max_;
}
if (price[i] < price[buy])
{
buy = i;
}
i++;
}
return max_;
}
};