知識點:數組操作
類似題目:
901 股票價格跨度 3 31.4% 中等
121 買賣股票的最佳時機 46 50.4% 簡單
122 買賣股票的最佳時機 II 43 55.0% 簡單
123 買賣股票的最佳時機 III 17 39.0% 困難
309 最佳買賣股票時機含冷凍期 13 49.3% 中等
188 買賣股票的最佳時機 IV 8 28.0% 困難
714 買賣股票的最佳時機含手續費 6 54.5% 中等
502 IPO 6 35.4% 困難
以【leetcode123】舉例,使用以下方法一招通吃,困難變easy(OVO)
思路:
設置兩維dp,dp[n][4],四個值分別表示:
0:買入第一個股票,第0時初始化爲股票的價格的負數
1:賣出第一個股票,第0時不能賣出,所以初始化爲0
2:買入第二個股票,第0時初始化爲股票的價格的負數,因爲最多買兩次,可以只買一次,所以在第0時也要初始化
3:賣出第二個股票,第0時不能賣出,所以初始化爲0
class Solution(object):
def maxProfit(self, prices):
"""
:type prices: List[int]
:rtype: int
"""
if not prices:
return 0
dp = [[float('-inf')] * 4 for _ in range(len(prices))]
dp[0] = [-1 * prices[0], 0, -1 * prices[0], 0]
for i in range(1, len(prices)):
dp[i][0] = max(0 - prices[i], dp[i-1][0])
dp[i][1] = max(dp[i-1][0] + prices[i], dp[i-1][1])
dp[i][2] = max(dp[i-1][1] - prices[i], dp[i-1][2])
dp[i][3] = max(dp[i-1][2] + prices[i], dp[i-1][3])
# print(dp)
return max(dp[-1])
【leetcode502】股票問題變種
使用DP可以解決,但在最後一個用例會出現超出內存與超時問題,超出內存使用滾動數組,超時問題暫未解決
NOTE:本題不再有時間序列,所以要對兩個輸入列表按照啓動資金x[1]從低到高排序,x[0]是否排序都可以
zipa = zip(Profits, Capital)
zipa.sort(key = lambda x: [x[1], -x[0]])
k = min(k, len(zipa))
dp = [[W] + [float('-inf')] * k for _ in range(2)]
dp[0] = [W] * (k+1)
for i in range(1, len(zipa) + 1):
for ki in range(1, k+1):
if dp[(i-1) % 2][ki-1] >= zipa[i-1][1]:
dp[i % 2][ki] = max(dp[(i-1) % 2][ki], dp[(i-1) % 2][ki-1] + zipa[i-1][0])
else:
dp[i % 2][ki] = dp[(i-1) % 2][ki]
# print(dp)
return max(max(dp))
另外leetcode一篇題解:
和本文思想差不多。還沒有仔細閱讀,先記錄在這兒: