买卖股票问题

买卖股票最佳时机

买卖股票Ⅰ

题意

给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。
你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。
返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。

解法方案

方案①:简单动态规划

这里可以使用两个变量,分别记录当前遍历到的最小的价格和当前最大的利润,初始时,显然,最小价值为第一个遍历的价值,即prices[0],而当前最大利润在最初为0,因为我们在最初的时候肯定没有利润。然后我们遍历一遍整个prices中的价值,如果当前价值与我们的最小价格之差大于最大利润,则此时我们需要更新最大利润,如果当前价格比最小价格小,我们就更新最小价格为当前价格,最终我们得到的最大利润即为结果。
时间复杂度:O(n)
空间复杂度:O(1)

代码

class Solution {
   
public:
    int maxProfit(vector<int>& prices) {
   
        if(!prices.size() || prices.size() == 1) return 0;
        int mi = prices[0], ans = 0;
        for(int i = 0; i < prices.size(); i++){
   
            if(prices[i] - mi > ans) ans = prices[i] - mi;
            else if(prices[i] < mi) mi = prices[i];
        }
        return ans;
    }
};

方案②: 使用单调队列

这里我们定义一个vector,首先我们需要在prices放入一个哨兵 -1(单调队列的常规操作),然后我们遍历整个prices中的元素,如果我们的单调栈不为空,同时,栈顶的元素比当前遍历的prices[i]要大,我们需要记录一下此时栈顶元素与栈底元素之差,即更新当前遍历到的最大的利润,更新完马上将栈顶元素弹出,而且我们这里可能不止弹出一个元素,是需要将大于prices[i]的所有元素同时弹出,这样做是为了保证整个队列是单调的,最后将当前遍历到的prices中的元素加到栈中。整个操作之后,很显然我们就可以得到最大利润。

代码:

class Solution {
   
public:
    int maxProfit(vector<
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

追梦_赤子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值