####假设兄弟都懂了值交易一次的动态规划的方法
##正向遍历一次:低买高卖;反向遍历一次:高买低卖,得到正向最大收益,反向最小收益的两个数组
##然后从两个数组里提取值,选取组合起来最大的。
##详情看代码里的注释
class Solution:
def maxProfit(self, prices: List[int]) -> int:
L=len(prices)
if L<=1:
#list长度不够,没有收益
return(0)
else:
####正向遍历一遍价格数组
####用只交易1次的思路,用动态规划从1~n走一遍,计算复杂度O(N),存储开销O(N)
#max_first的第i个元素保存:第1天~第i天交易1次的最大收益
max_first=[0]*L
min_price=prices[0]
max_profit_=0
for i in range(1,L):
profit_i=prices[i]-min_price
if profit_i>=max_profit_:
max_first[i]=profit_i
max_profit_=profit_i
else:
max_first[i]=max_profit_
if prices[i]<min_price:
min_price=prices[i]
#### 反向遍历一遍价格数组
#### 【上面是正向遍历一遍价格数组,下面反向遍历一遍价格数组,比如第n天高价买入,第n-1天低价卖出,这个收益的相反数就是正向的最大收益。】
##用只交易1次的思路,用动态规划从n~1走一遍(注意!是反向),计算复杂度O(N),存储开销O(N)
#min_second的第i个元素保存:第n天~第i天交易1次的最小收益(负值)
min_second=[0]*L
max_price=prices[L-1]
min_profit_=float("inf")
for i in range(L-2,1,-1):
profit_i=prices[i]-max_price
if profit_i<=min_profit_:
min_profit_=profit_i
min_second[i]=profit_i
else:
min_second[i]=min_profit_
if prices[i]>max_price:
max_price=prices[i]
####最后遍历一遍价格数组,时间开销O(N)
## 对于第i天,从正向数组获取第1天~第i-1天交易一次的最大收益,从反向数组获取第n天~第i天交易一次的最小收益
## 综合上述两个值可以得到以第i天为分割点,两次交易时的最大收益,选取所有的i里最大的。
#注意要比较只交易一次和交易两次的较大值作为最终输出。下述max_profit_原本是正向的一次交易的最大收益
for i in range(1,L-1):
two_=max_first[i]-min_second[i+1]
if two_>max_profit_:
max_profit_=two_
return(max_profit_)
LeetCode题解:123题——最多两次交易股票,收益最大——化归思想
最新推荐文章于 2023-08-26 22:32:07 发布