121 买卖股票的最佳时机
描述:给定一个数组 它的第i个元素是一支给定股票第i天的价格
如果你最多只允许完成一笔交易(即买入和卖出一支股票) 设计一个算法来计算你所能获取的最大利润
注意你不能在买入股票前卖出股票
min_p, max_p = 99999999, 0
for i in range(len(prices)):
min_p = min(min_p, prices[i])
max_p = max(max_p, prices[i] - min_p)
return max_p
309.最佳买卖股票时机含冷冻期
描述:给定一个整数数组 其中第i个元素代表了第i天的价格
设计一个算法计算出最大利润 在满足一下约束条件下 你可以尽可能地完成更多的交易(多次买卖一支股票):
你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)
卖出股票后 你无法在第二天买入股票(即冷冻期为1天)
n = len(prices)
if n == 0:
return 0
sell = [0 for _ in range(n)] # 第i天卖出时的最大利润
buy = [0 for _ in range(n)] # 第i天买入时的最大利润
cool = [0 for _ in range(n)] # 第i天冷冻时的最大利润
buy[0] = - prices[0]
for i in range(1, n):
sell[i] = max(buy[i - 1] + prices[i], sell[i - 1])
buy[i] = max(cool[i - 1] - prices[i], buy[i - 1])
cool[i] = sell[i-1]
return sell[-1]
714 买卖股票的最佳时机含手续费
描述:给定一个整数数组prices 其中第i个元素代表了第i天的股票价格 非负整数fee代表了交易股票的手续费用
你可以无限次地完成交易 但是你每次交易都需要付手续费 如果你已经购买了一个股票 在卖出它之前你就不能再继续购买股票了
返回获得利润的最大值
n = len(prices)
if n < 2:
return 0
dp1 = [0 for _ in range(n)] # 第i天手上有股票时的最大收益
dp2 = [0 for _ in range(n)] # 第i天手上无股票时的最大收益
dp1[0] = -prices[0]
for i in range(1, n):
dp1[i] = max(dp1[i - 1], dp2[i - 1] - prices[i]) # 第二项表示在第i天买入股票
dp2[i] = max(dp2[i - 1], dp1[i - 1] + prices[i] - fee) # 第二项表示在第i天将股票卖出
return dp2[n - 1]