LeetCode 121. Best Time to Buy and Sell Stock

本文介绍了一种使用动态规划解决股票买卖最大利润问题的方法。通过定义f[i]为以第i天价格卖出的最大利润,dp[i]为前i天的最大利润,建立了递推公式。文中还给出了一段简洁高效的C++实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

和53题最大子串和一样的题目,把买入到售出当做一个子序列想就一模一样了。DP方程如下:

f[i]:以a[i]作为抛出日的最大profit (和最大字串和一样,以a[i]结尾的最大profit)

dp[i]:下标0~i过程中最大profit

令x为买入时的价格a

f[i] = max{ a[i]-x                            a[i]在交易内  在a[i]售出

                  0 }      此时x<-a[i]         a[i]在交易内  在a[i]买入并售出

dp[i] = max{ f[i]                             a[i]在交易内

                    dp[i-1]                        a[i]不在交易内

由于f[i]和dp[i]之和上一个状态有关,所以可以压缩存储空间。且f[i]函数非常简单,写代码的时候可以直接放在dp[i]中写。(上面单独写出来方便整理思路)

网上很多代码中维护一个min_price,其实就是上述买入时的价格x,体会一下。个人感觉还是动态规划的思路最清楚,化简以后和网上别的思路是一样的。

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

 

转载于:https://www.cnblogs.com/hankunyan/p/8980563.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值