LeetCode 每日一题之 股票求最大利润问题

题目:

给定一个数组 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_;

    }
};

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值