LeetCode题解:123题——最多两次交易股票,收益最大——化归思想

####假设兄弟都懂了值交易一次的动态规划的方法
##正向遍历一次:低买高卖;反向遍历一次:高买低卖,得到正向最大收益,反向最小收益的两个数组
##然后从两个数组里提取值,选取组合起来最大的。
##详情看代码里的注释
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笔记,leetcode,动态规划)