返回

算法题实战攻略:揭秘买卖股票的最佳时机

前端

引言

在股票市场中,抓住最佳的买卖时机往往是盈利的关键。在算法领域,一道经典的面试题便是“买卖股票的最佳时机”。这道题看似简单,却蕴含着深刻的算法原理。本文将带领读者深入解析这道题,掌握两种解题方法——贪心算法和动态规划,揭秘买卖股票的算法之道。

贪心算法

贪心算法是一种自顶向下的求解方法,即在每个步骤中做出局部最优选择,从而逐步逼近全局最优解。对于买卖股票的问题,贪心算法的基本思想是:

  • 首先,从股票价格序列的左端开始扫描,找出第一个“低买”点,即价格最低的点。
  • 然后,从低买点之后继续扫描,找出第一个“高卖”点,即价格最高的点。
  • 计算低买点到高卖点的差值,即收益。
  • 继续扫描价格序列,重复以上步骤,直到扫描完整个序列。
  • 将所有收益相加,得到最大收益。

动态规划

动态规划是一种自底向上的求解方法,即从问题的子结构开始逐步递推,最终求解整个问题。对于买卖股票的问题,动态规划的基本思想是:

  • 定义状态:dp[i][j]表示在第i天,交易次数限制为j时的最大收益。
  • 转移方程:
    • dp[i][j] = max(dp[i-1][j], dp[i-1][j-1] + prices[i] - prices[buy_day])
    • 其中,prices[i]表示第i天的股票价格,buy_day是最近一次买入股票的那一天。
  • 边界条件:dp[0][0] = 0,dp[i][0] = 0 (i > 0)
  • 最终答案:max(dp[n-1][j]) (j = 1, 2, ..., k)

实战演练

假设股票价格序列为[7, 1, 5, 3, 6, 4],交易次数限制为2次。

贪心算法解法:

  • 低买点:1元/股(第2天)
  • 高卖点:6元/股(第5天)
  • 收益:6元/股 - 1元/股 = 5元/股

动态规划解法:

import numpy as np

def maxProfit(prices, k):
  # 初始化动态规划表
  dp = np.zeros((len(prices), k+1))

  for i in range(1, len(prices)):
    for j in range(1, k+1):
      # 更新最大收益
      dp[i][j] = max(dp[i-1][j], dp[i-1][j-1] + prices[i] - min(prices[i-1], dp[i-1][j-1]))

  return int(dp[len(prices)-1][k])

prices = [7, 1, 5, 3, 6, 4]
k = 2
print(maxProfit(prices, k))

输出结果:5

总结

通过贪心算法和动态规划两种方法,我们成功求解了买卖股票的最佳时机问题。贪心算法简单易懂,但可能无法找到全局最优解。动态规划则能够保证找到最优解,但时间复杂度更高。在实际应用中,可根据具体情况选择合适的方法。