Leetcode121.买卖股票的最佳时机

Leetcode121.买卖股票的最佳时机

一、题目描述

https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock/

你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。
返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。

这道题之前在某处见过(忘记是算法导论还是算法设计与分析了)。

二、思想

毫无疑问,求解最优解问题 ,使用DP。
状态定义:dp[i]:在前i-1天中的某一天,买入股票,在第i天卖出股票 所获得的最大利润(一定是第i天卖出)。
状态转移方程:在前i-1天 买出股票 第i天卖出股票等于 前i-1天买卖股票获得的最大利润和前一天(第i天的前一天)股票的增减值之和
以测试样例分析一下:

[7,1,5,3,6,4]

(从0开始)
第2天卖出获得的利润
dp[2]=5-1=4
第3天卖出获得的利润:第二天卖出获得的利润+第3天的前一天股票的增减值
dp[3]=4+3-5=2

第i天和第i-1天股票的增减值,我们可以先求出来放到一个一维数组中 ,不放其实也可以(我记得当初见书上是放进了一个一维数组中 )

如果你不能获取任何利润,返回 0 。

三、代码实现

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        vector<int> a(prices.size());
        a[0]=prices[0];
        for(int i=1;i<prices.size();i++){
            a[i]=prices[i]-prices[i-1];
        }
        int max0=0;
        int dp[100005]={0};
        for(int i=1;i<a.size();i++){
            dp[i]=max(dp[i-1]+a[i],0);
            if(dp[i]>max0)
                max0=dp[i];
        }
        return max0;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Mae_strive

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

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

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

打赏作者

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

抵扣说明:

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

余额充值