「Day2」带你入门动态规划「hot100之leetcode121」

76 阅读2分钟

一、题目

121. 买卖股票的最佳时机

给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。

你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。

返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。

二、动态规划解题思路总结

  • 明确dp[i]的含义
  • 找到dp[i]dp[i-1]的关系,也就是状态转移方程
  • 计算初始值dp[0]

三、题解

3.1 思路分析

求的是计算你所能获取的最大利润,那么我们首先需要明确dp[i]的含义,这里的dp[i]可以是第i天获得的最大利润,我们的目标就是在所有的dp[i]中找到最大的dp[i]

找到dp[i]dp[i-1]的关系,dp[i-1]就是第i-1天获得的最大利润,第i天获得的利润应该是第i天的价格减去第i天之前的最小价格。第i天获得的最大利润应该是第i-1天获得的最大利润与第i天获得的利润中的较大的那一个,也就是dp[i]应该等于dp[i-1]price[i]- minprice中的最大值;

所以我们还要维护一下minprice,其中i = 0时,minprice = price[0],i = 1时,minprice = min{minprice,price[1-1]},以此类推,minprice = min{minprice,price[i-1]}

计算初始值:很显然第一天获得的最大利润是0,即 dp[0] = 0

3.2 思路总结

相关含义
dp[i]i天获得的最大利润
dp[i-1]i-1天获得的最大利润
minpricei天之前的最小价格
price[i]i天的价格
动态规划思路
明确dp[i]的含义是第i天获得的最大利润
找到dp[i]dp[i-1]的关系dp[i] = max{dp[i-1], price[i]- minprice}
计算初始值dp[0] = 0

3.3 代码

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int n = prices.size();
        int dp[n];
        dp[0] = 0;
        int minprice = prices[0];
        for(int i = 1; i < n; i++)
        {
            minprice = min(minprice, prices[i-1]);
            dp[i] = max(dp[i-1], prices[i] - minprice);
        }
        return dp[n-1];
    }
};

四、进度及知识点总结

题目知识点进度
136数组、位运算(异或)、哈希表1
121数组、动态规划2

万事开头难,前期选一个些比较简单的题目,热热身,比较容易进入状态,快来跟我一起来记录这个从 0 到 N 的过程吧,享受愉快的刷题过程吧~