返回

让LeetCode网站助力你的股票投资决策,动态规划与极值更新为您导航

前端







# LeetCode——买卖股票的最佳时机:动态规划+更新极值

欢迎各位来到LeetCode的股票最佳时机专场!今天,我们将为您奉上一道精彩的难题,并提供详细的解决方案。

## 题目

你手上有数列arr,其中每个元素arr[i]表示某支股票在第i天收盘时每股的价格。请你设计一个算法,寻找买卖股票的最佳时机,以获得最大利润。

## 思路一:更新最大值和最小值

为了解决这道难题,我们可以采用更新最大值和最小值的算法。具体步骤如下:

1. 假设第一个元素是价格最小的值minPrice。
2. 定义一个价格最大差maxPriceDiff,并设置值为03. 从数组的第二个元素开始更新价格最大差和最小值。
4. 当股票价格高于当前的最小价格minPrice时,更新maxPriceDiff为max(maxPriceDiff, currentPrice - minPrice)。
5. 当股票价格低于当前的最小价格minPrice时,更新minPrice为currentPrice。

## 思路二:动态规划

除了更新最大值和最小值之外,我们还可以采用动态规划的方法来解决这道难题。具体步骤如下:

1. 构建一个数组dp,其中dp[i]表示在第i天卖出股票所能获得的最大利润。
2. 初始化dp[0]为03. 从数组的第二个元素开始计算dp[i]:
    * 如果dp[i-1] > 0,则dp[i] = dp[i-1] + arr[i] - arr[i-1]。
    * 否则,dp[i] = arr[i] - arr[i-1]。

## 代码实现

```python
def maxProfit(arr):
    """
    :type arr: List[int]
    :rtype: int
    """
    if not arr:
        return 0

    minPrice = arr[0]
    maxPriceDiff = 0

    for i in range(1, len(arr)):
        if arr[i] < minPrice:
            minPrice = arr[i]
        else:
            maxPriceDiff = max(maxPriceDiff, arr[i] - minPrice)

    return maxPriceDiff

def maxProfit_dp(arr):
    """
    :type arr: List[int]
    :rtype: int
    """
    if not arr:
        return 0

    dp = [0] * len(arr)
    dp[0] = 0

    for i in range(1, len(arr)):
        if dp[i-1] > 0:
            dp[i] = dp[i-1] + arr[i] - arr[i-1]
        else:
            dp[i] = arr[i] - arr[i-1]

    return max(dp)

总结

通过更新最大值和最小值以及动态规划这两种算法,我们能够有效地解决LeetCode的股票最佳时机难题。希望本次讲解能对各位有所帮助!