算法每日一题[Day2]

147 阅读1分钟

剑指 Offer 63. 股票的最大利润

题目描述

假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖该股票一次可能获得的最大利润是多少?

示例

输入: [7,1,5,3,6,4]
输出: 5
解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。
注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格。

思路

利用动态规划解决。

  • 当天抛售最大利润:当天的prices减去min(prices)
  • 状态设定:DP数组为前i天股票的最大利润。
  • 状态转移方程:前i天股票的最大利润和前i-1天的最大利润可能等价,前提是以i天的价格抛售获得的最大利润要小于前i-1天的最大利润(即DP[i-1])

dp[i+1] = max(prices[i+1] - min(prices[:i+1]), dp[i])


参考代码

class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        # 确定dp数组下标含义:dp[i]表示前i天卖出的最大利润
        n = len(prices)
        if n == 0: return 0
        dp = list(0 for _ in range(n))
        # 初始化dp数组
        for i in range(n - 1):
            # 状态转移方程
            dp[i+1] = max(prices[i+1] - min(prices[:i+1]), dp[i])
        return dp[n-1]

代码优化(todo)

  • 优化时间效率