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


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



猜您在找 Leetcode练习(Python):数组类:第122题:给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。 设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。 注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。 风口之下,猪都能飞。当今中国股市牛市,真可谓“错过等七年”。 给你一个回顾历史的机会,已知一支股票连续n天的价格走势,以长度为n的整数数组表示,数组中第i个元素(prices[i])代表该股票第i天的股价。 假设你一开始没有股票,但有至多两次买入1股而后卖出1股的机会,并且买入前一定要先保证手上没有股票。若两次交易机会都放弃,收益为0。 设计算法,计算你能获得的最大收益。 输入数值范围:2<=n< 如何测试一支笔 风口之下,猪都能飞。当今中国股市牛市,真可谓“错过等七年”。 给你一个回顾历史的机会,已知一支股票连续n天的价格走势,以长度为n的整数数组表示, 软件测试经典面试题——如何测试一支签字笔(尽量全面) oracle的购买价格研究 同花顺股票自动交易 给定一个数组A[0,1,...,n-1],请构建一个数组B[0,1,...,n-1],其中B中的元素B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1]。不能使用除法。 一笔订单,但是误付了两笔钱!这种重复付款异常到底该如何解决? 给定一个长度不限的字符串,找出该字符串中出现次数最多的字符
 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM