【面试题63 股票的最大利润】
面试题63:股票的最大利润:假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖该股票一次可能获得的最大利润是多少?
思路:动态规划。
- 明确状态:本题唯一的变量就是“能够获取的最大利润”
- dp 数组:
dp[i]
表示在第i
天选择卖出,能够获取的最大利润 - 明确选择:假设在第
i
天卖出,那么可以选择在0~i-1
的任意一天买入,原则是能够获得最大利润 - 状态间转移关系:不论第
i
天的股票价格是否高于前一天,都有以下状态转移关系:dp[i] = max(0, prices[i]-(prices[i-1]-dp[i-1]))
,利用prices[i-1]-dp[i-1]
可以计算得到前i-1
天内的最低股票价格 - 确定 base case:当
i=0
时,利润为 0
注意到状态转移公式 dp[i]
仅和 dp[i-1]
有关,所以不需要真的建立 dp 数组,用变量 pre
和 cur
来维护即可。
时间复杂度:
空间复杂度:
class Solution:
def maxProfit(self, prices: List[int]) -> int:
if not prices: return 0
n = len(prices)
pre, m = 0, 0
for i in range(1, n):
cur = max(0, prices[i]-(prices[i-1]-pre))
pre = cur
m = cur if cur > m else m
return m