題目:給定一個數組,它的第 i 個元素是一支給定的股票在第 i 天的價格。 設計一個算法來計算你所能獲取的最大利潤。你最多可以完成 兩筆 交易。 注意: 你不能同時參與多筆交易(你必須在再次購買前出售掉之前的股票)。
思路:自己的思路是每逢可以交易的條件就進行交易,沒有考慮全局。結果一直不對,參考網上一個大神的程序,講解的非常明白,如程序1,自己的思路如程序2。
程序1:
class Solution:
def maxProfit(self, prices):
if prices==[]:
return 0
length=len(prices)
#結束時的最高利潤=[天數][是否持有股票][賣出次數]
dp=[ [[0,0,0],[0,0,0] ] for i in range(0,length) ]
#第一天休息
dp[0][0][0]=0
#第一天買入
dp[0][1][0]=-prices[0]
# 第一天不可能已經有賣出
dp[0][0][1] = float('-inf')
dp[0][0][2] = float('-inf')
#第一天不可能已經賣出
dp[0][1][1]=float('-inf')
dp[0][1][2]=float('-inf')
for i in range(1,length):
#未持股,未賣出過,說明從未進行過買賣
dp[i][0][0]=0
#未持股,賣出過1次,可能是今天賣的,可能是之前賣的
dp[i][0][1]=max(dp[i-1][1][0]+prices[i],dp[i-1][0][1])
#未持股,賣出過2次,可能是今天賣的,可能是之前賣的
dp[i][0][2]=max(dp[i-1][1][1]+prices[i],dp[i-1][0][2])
#持股,未賣出過,可能是今天買的,可能是之前買的
dp[i][1][0]=max(dp[i-1][0][0]-prices[i],dp[i-1][1][0])
#持股,賣出過1次,可能是今天買的,可能是之前買的
dp[i][1][1]=max(dp[i-1][0][1]-prices[i],dp[i-1][1][1])
#持股,賣出過2次,不可能
dp[i][1][2]=float('-inf')
return max(dp[length-1][0][1],dp[length-1][0][2],0)
程序2:
class Solution:
def maxProfit(self, prices: List[int]) -> int:
length = len(prices)
if length <= 1:
return 0
buy = prices[0]
auxiliary= [0] * length
mark = 0
for index in range(1, length):
if prices[index - 1] >= prices[index]:
mark += 1
buy = prices[index]
auxiliary[index] = prices[index] - buy
continue
elif prices[index - 1] < prices[index]:
buy = min(buy, prices[index])
auxiliary[index] = prices[index] - buy
if mark <= 1:
auxiliary.sort()
result = auxiliary[length - 1]
else:
auxiliary.sort()
result = auxiliary[length - 1] + auxiliary[length - 2]
return result