zoukankan      html  css  js  c++  java
  • 123买卖股票的最佳时机III

    题目:给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。注意: 你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
    链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-iii

    法一:参考别人自己写的代码

    思路:动态规划,首先题中有两个变量,股票在第几天卖出和卖出的次数,dp[i][j]表示第i天卖出j次股票后的最大利润,状态转移方程:a = max([prices[row] - prices[j] + dp[j][col-1] for j in range(0,row)],从中仔细观察可以看出,- prices[j] + dp[j][col-1] d会被多次重复计算,所以为了减少计算次数,可以把原状态转移方程进行变形,将求最大值转换为求最小值,之所以可以这样转换,原因是分清状态转移方程中的动态量和静态量,由于prices[row]不受变量j的影响,所以是静态量,而后面两个受j的影响,所以是动态量,可以保存其最小值。

    from typing import List
    class Solution:
        def maxProfit(self, prices: List[int]) -> int:
            size = len(prices)
            # 特判
            if size <= 1:
                return 0
            # dp[i][j]表示第i天进行j次卖出后的最大获利
            dp = [[0] * 3 for _ in range(size)]
            print(dp)
            for col in range(1,3):
                # dp[0][1]表示第1天卖出1次,显然为0,所以用默认值,
                # dp[0][2]也是0,
                # 有可能是负值,所以和0进行比较
                dp[1][col] = max(0,prices[1] - prices[0])
                k = prices[0] - dp[0][col-1]
                for row in range(2,size):
                    # 由于有大量重复计算,所以每次只需计算k即可,这样很省时间
                    k = min(k, prices[row-1] - dp[row-1][col-1])
                    a = prices[row] - k
                    # # 计算a的时候,有大量重复的计算,
                    # a = max([prices[row] - prices[j] + dp[j][col-1] for j in range(0,row)])
                    dp[row][col] = max(dp[row-1][col], a)
            print(dp)
            return max(dp[-1][-1],0)
    if __name__ == "__main__":
        # prices = [3,3,5,0,0,3,1,4]
        # prices = [3,3,5,0,0,3,1,4]
        # prices = [3,2,5,0,0,3,1,4]
        prices = [1,2]
        # prices = [2,1,4]
        max_profit = Solution().maxProfit(prices)
        print(max_profit)
    View Code

    ttt

  • 相关阅读:
    centos7 安装jdk 1.8
    CentOS查看Java进程并部署jar包
    Mybatis传多个参数(三种解决方案)
    mybatis使用注解往postgresql数据库表insert数据[主键自增]的写法
    在Linux上安装tomcat和JDK
    Linux下部署springboot项目的步骤及过程
    maven安装第三方jar包到本地仓库
    Android 开源动画框架:NineOldAndroids
    Android多国语言的value文件夹命名方式
    C++编程经验-返回局部变量的讨论(转)
  • 原文地址:https://www.cnblogs.com/xxswkl/p/12327570.html
Copyright © 2011-2022 走看看