Leetcode121.买卖股票的最佳时机

文章目录

  • 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;
    }
};

你可能感兴趣的:(每日一道算法题,算法,动态规划,DP,leetcode)