LeetCode121. 买卖股票的最佳时机(单调栈+动态规划)

本文深入探讨了LeetCode 121题目的两种高效解决方案:利用单调队列原理优化的栈方法,以及直观易懂的动态规划策略。通过实例演示如何在股票价格波动中寻找最大利润。

题目链接Leetcode121

在这里插入图片描述
思路

  • 1,找前面和它比最小的更新答案,可以维护一个单调栈解决,每次跟栈底比(实际上是单调队列,但不用控制窗口大小就是了)
class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int n = prices.size();
        if (n == 0) return 0; 
        int stk[n], top = -1;
        int ans = 0;
        for (int i = 0; i < n; i++) {
            while (top!=-1 && stk[top]>=prices[i]) top--; //模拟一个单调栈
            stk[++top]=prices[i];
            ans=max(ans, stk[top]-stk[0]);
        }
        return ans;
    }
};
  • 2,动态规划,dp[i]表示到达i时最小的数,每次更新答案时与dp[i-1]求差值就好了
class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int n = prices.size();
        if (n == 0) return 0; 
        int bef; //int dp[n];
        int ans = 0;
        bef=prices[0]; //dp[0]=prices[0]; //初试状态
        for (int i = 1; i < n; i++) {
            /*
            dp[i]=min(dp[i-1], prices[i]);
            ans=max(ans, prices[i]-dp[i-1]); //在正数内所以不存在溢出的情况,因为负数比正数多一位
            */
            ans=max(ans, prices[i]-bef);
            bef=min(bef, prices[i]);
        }
        return ans;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小胡同的诗

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

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

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

打赏作者

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

抵扣说明:

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

余额充值