剑指 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)
- 优化时间效率