返回

巧用动态规划,一招制胜力扣121:买卖股票的最佳时机

见解分享

题目

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

如果你完成了一笔交易(即买入和卖出一支股票),你将会得到一个收益 prices[sell] - prices[buy] ,其中 buy 是你买入股票的日子,sell 是你卖出股票的日子。

我们能完成多少笔交易来获得最大收益?

注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

动态规划算法

为了解决这道题,我们可以使用动态规划算法。动态规划算法是一种解决优化问题的经典算法,它将问题分解成若干个子问题,然后逐个解决这些子问题,最终得到问题的整体最优解。

对于这道题,我们可以定义一个状态 dp[i] ,表示在第 i 天结束时,我们所能获得的最大收益。然后,我们可以通过以下公式来计算 dp[i] :

dp[i] = max(dp[i-1], prices[i] - min_price)

其中,min_price 表示在第 i 天之前,股票的最低价格。

这个公式的含义是:在第 i 天结束时,我们所能获得的最大收益要么是前一天的最大收益 dp[i-1] ,要么是当天股票价格与之前最低价格之差 prices[i] - min_price 。

我们可以使用一个变量 min_price 来记录股票的最低价格。当我们遇到一个新的股票价格时,如果这个价格比 min_price 小,我们就更新 min_price 的值。

示例

为了更好地理解动态规划算法的具体实现,我们来看一个示例。

假设我们有一个股票价格数组 prices = [7, 1, 5, 3, 6, 4] 。

我们首先初始化 dp 数组:

dp = [0, 0, 0, 0, 0, 0]

然后,我们从第 1 天开始计算 dp[i] :

dp[1] = max(dp[0], prices[1] - min_price) = max(0, 1 - 7) = -6
dp[2] = max(dp[1], prices[2] - min_price) = max(-6, 5 - 1) = -1
dp[3] = max(dp[2], prices[3] - min_price) = max(-1, 3 - 1) = 2
dp[4] = max(dp[3], prices[4] - min_price) = max(2, 6 - 1) = 5
dp[5] = max(dp[4], prices[5] - min_price) = max(5, 4 - 1) = 3

最终,我们得到 dp[5] = 5 ,这表示我们可以在第 1 天买入股票,在第 4 天卖出股票,从而获得最大收益 5 。

总结

在这篇文章中,我们介绍了力扣121:买卖股票的最佳时机这道题的动态规划算法。我们从题目开始,然后介绍了动态规划算法的具体实现,最后提供了一个清晰的示例来说明算法的具体实现。相信您在读完本文后,能够轻松掌握这道题的解法并将其应用到实际场景中。