[Leetcode][Python] Best Time to Buy and Sell Stock I,II,III,IV
121. Best Time to Buy and Sell Stock I
题目大意
最多交易一次,先买后卖。
思路:所以定义min_price,max_profit 两个变量,遍历更新min_price,并计算更新max_profit。
代码
class Solution:
def maxProfit(self, prices: List[int]) -> int:
max_profit,min_price = 0, float('inf')
for price in prices:
min_price = min(min_price,price)
max_profit = max(max_profit,price-min_price)
return max_profit
122. Best Time to Buy and Sell Stock II
题目大意
不限定交易次数,先买后卖。
思路:遍历,将所有大于0的交易求和,即为结果。
代码
class Solution:
def maxProfit(self, prices: List[int]) -> int:
return sum(max(0,prices[i]-prices[i-1]) for i in range(1,len(prices)))
123. Best Time to Buy and Sell Stock III
题目大意
不限定交易次数,先买后卖。
思路:遍历,将所有大于0的交易求和,即为结果。
local[i][j]: 在到达第i天时最多可进行j次交易并且最后一次交易在最后一天卖出的最大利润,此为局部最优。
global[i][j]: 在到达第i天时最多可进行j次交易的最大利润,此为全局最优。
local[i][j] = max(global[i - 1][j - 1] + max(diff, 0), local[i - 1][j] + diff)
global[i][j] = max(local[i][j], global[i - 1][j])
代码
限制最多交易两次,先买后卖,DP。
class Solution:
def maxProfit(self, k:int, prices: List[int]) -> int:
N = len(prices)
g = [[0] * 3 for _ in range(N)]
l = [[0] * 3 for _ in range(N)]
for i in range(1, N):
diff = prices[i] - prices[i - 1]
for j in range(1, 3):
l[i][j] = max(g[i - 1][j - 1] + max(diff, 0), l[i - 1][j] + diff)
g[i][j] = max(l[i][j], g[i - 1][j])
return g[-1][-1]
188. Best Time to Buy and Sell Stock IV
题目大意
不限定交易次数,先买后卖。
思路:遍历,将所有大于0的交易求和,即为结果。
local[i][j]: 在到达第i天时最多可进行j次交易并且最后一次交易在最后一天卖出的最大利润,此为局部最优。
global[i][j]: 在到达第i天时最多可进行j次交易的最大利润,此为全局最优。
local[i][j] = max(global[i - 1][j - 1] + max(diff, 0), local[i - 1][j] + diff)
global[i][j] = max(local[i][j], global[i - 1][j])
代码
限制最多交易k,先买后卖,DP。
- k >= N --> 相当于无限次交易,Best Time to Buy and Sell Stock II
- k < N --> 最多k次交易,Best Time to Buy and Sell Stock III
class Solution:
def maxProfit(self, k: int, prices: List[int]) -> int:
if k <= 0 or not prices:
return 0
N = len(prices)
if k >= N:
return sum(max(0,prices[i]-prices[i-1])for i in range(1,N))
g = [[0] * (k+1) for _ in range(N)]
l = [[0] * (k+1) for _ in range(N)]
for i in range(1, N):
diff = prices[i] - prices[i - 1]
for j in range(1, k+1):
l[i][j] = max(g[i - 1][j - 1] + max(diff, 0), l[i - 1][j] + diff)
g[i][j] = max(l[i][j], g[i - 1][j])
return g[-1][-1]