⛅(day18)
目录
🖍题目:
给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
🌠示例 1:
🌠示例 2:
🌠示例 3:
🌠示例 4:
题目分析:
题目要求找出在最多进行两次交易的情况下获得的利润最大值,这意味着我们可以进行一次交易,也可以进行两次交易。但是手中持有股票时必须先出售才能进行第二次购买。
解题思路:
代码实现
🌈动态规划解法
def maxProfit(prices):
first_buy_profit = second_buy_profit = -prices[0]
first_sell_profit = second_sell_profit = 0
for i in range(1, len(prices)):
first_buy_profit = max(first_buy_profit, -prices[i])
first_sell_profit = max(first_sell_profit, first_buy_profit+ prices[i])
second_buy_profit = max(second_buy_profit, first_sell_profit - prices[i])
second_sell_profit = max(second_sell_profit, second_buy_profit + prices[i])
return second_sell_profit
✏代码注释
def maxProfit(prices):
# 初始化递归基础
first_buy_profit = second_buy_profit = -prices[0]
first_sell_profit = second_sell_profit = 0
# 运行递归公式,因为第0天已在初始化中讨论,所以i从1开始
for i in range(1, len(prices)):
first_buy_profit = max(first_buy_profit, -prices[i])
first_sell_profit = max(first_sell_profit, first_buy_profit + prices[i])
second_buy_profit = max(second_buy_profit, first_sell_profit - prices[i])
second_sell_profit = max(second_sell_profit, second_buy_profit + prices[i])
return second_sell_profit # 返回结果
一位程序需要遍历一次数组所以时间复杂度为O(n),只需四个状态储存运行,空间复杂度O(1).
今天就到这,明天见。🚀
❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄end❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄