• Leetcode练习(Python):数组类:第123题:给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。 设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。 注意: 你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。


    题目:给定一个数组,它的第 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
  • 相关阅读:
    分布式文件系统
    分布式文件系统
    ASP.NET MVC 使用 FluentScheduler 定时器计划任务
    从零开始学 Java
    从零开始学 Java
    从零开始学 Java
    从零开始学 Java
    从零开始学 Java
    从零开始学 Java
    从零开始学 Java
  • 原文地址:https://www.cnblogs.com/zhuozige/p/12744978.html
Copyright © 2020-2023  润新知