首页 > 其他分享 >123. 买卖股票的最佳时机 III(难)

123. 买卖股票的最佳时机 III(难)

时间:2023-11-20 19:25:04浏览次数:30  
标签:示例 股票 123 最佳时机 prices 股票价格 III dp 利润

目录

题目

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

示例 1:

输入:prices = [3,3,5,0,0,3,1,4]
输出:6
解释:在第 4 天(股票价格 = 0)的时候买入,在第 6 天(股票价格 = 3)的时候卖出,这笔交易所能获得利润 = 3-0 = 3 。
随后,在第 7 天(股票价格 = 1)的时候买入,在第 8 天 (股票价格 = 4)的时候卖出,这笔交易所能获得利润 = 4-1 = 3 。

示例 2:

输入:prices = [1,2,3,4,5]
输出:4
解释:在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。
注意你不能在第 1 天和第 2 天接连购买股票,之后再将它们卖出。
因为这样属于同时参与了多笔交易,你必须在再次购买前出售掉之前的股票。

示例 3:

输入:prices = [7,6,4,3,1]
输出:0
解释:在这个情况下, 没有交易完成, 所以最大利润为 0。

示例 4:

输入:prices = [1]
输出:0

动态规划

class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        n = len(prices)
        # 初始化动态规划数组
        dp = [[[0] * 2 for _ in range(3)] for _ in range(n)]

        # base case,不用for处理k直接列举全部
        dp[0][1][0] = 0
        dp[0][2][0] = 0  # 第一天不持有股票,利润为0
        dp[0][1][1] = -prices[0]
        dp[0][2][1] = -prices[0]  # 第一天持有股票,利润为-buy

        # 状态转移
        for i in range(1, n):#前面处理了第一天的情况,直接从第二天开始,可以避免下标越界的发生
            dp[i][1][0] = max(dp[i-1][1][0], dp[i-1][1][1] + prices[i])  # 不持有股票的情况,取前一天也不持有股票和前一天持有股票但今天卖出的最大利润
            dp[i][2][0] = max(dp[i-1][2][0], dp[i-1][2][1] + prices[i]) 
            dp[i][1][1] = max(dp[i-1][1][1], dp[i-1][0][0]-prices[i])  # 持有股票的情况,取前一天也持有股票和前一天不持有股票但今天买入的最大利润,交易次数k减一
            dp[i][2][1] = max(dp[i-1][2][1], dp[i-1][1][0]-prices[i])  #交易次数k减一

        return dp[n-1][2][0]  # 最后一天,进行了两次交易,不持有股票的利润即为最大利润

标签:示例,股票,123,最佳时机,prices,股票价格,III,dp,利润
From: https://www.cnblogs.com/lushuang55/p/17844282.html

相关文章

  • ERROR: Permission to stevenlong123/test.git denied to smith-bing. fatal: Could n
    第一次练习git提交代码到github时出现的错误。这里就是说github服务器拒接了我们,不支持远程连接。发现是因为我使用的是ssh来提交的,ssh是安全连接需要通信双方各有一对公钥私钥,github服务器不会自动交换公钥,需要手动在github存储库中部署自己电脑的公钥。使用git命令“ls-al~/.s......
  • SP12304
    题目传送门简述题目:题目要求找出满足条件\(σ(i)=n\)的最小整数\(i\),其中\(σ(i)\)表示\(i\)的所有正因子的和。解题思路:首先定义一个函数\(Suum(i)\),用于计算\(i\)的所有正因子的和。在函数内部,使用一个循环遍历\(i\)的所有可能因子。对于每一个因子\(i\),如......
  • [ARC123E] Training
    多测,求值\[\sum_{i=1}^{n}\Big[a+\lfloor\frac{i}{b}\rfloor=c+\lfloor\frac{i}{d}\rfloor\Big]\]\(1\leT\le2\times10^5\),\(1\len\le10^9\),\(1\lea,b,c,d\le10^6\)。没见过,还得是广附哥。令\(b\led\),设\(f(x)=a+\dfrac{x}{b}\),\(g(x)=c+......
  • openGauss学习笔记-123 openGauss 数据库管理-设置账本数据库-账本数据库概述
    openGauss学习笔记-123openGauss数据库管理-设置账本数据库-账本数据库概述123.1背景信息账本数据库融合了区块链思想,将用户操作记录至两种历史表中:用户历史表和全局区块表。当用户创建防篡改用户表时,系统将自动为该表添加一个hash列来保存每行数据的hash摘要信息,同时在blockc......
  • 代码随想训练营第三十二天(Python)| 122.买卖股票的最佳时机 II、55. 跳跃游戏、45.跳跃
    122.买卖股票的最佳时机II1、贪心classSolution:defmaxProfit(self,prices:List[int])->int:res=0foriinrange(1,len(prices)):res+=max(prices[i]-prices[i-1],0)returnres2、动态规划classSolution:d......
  • 32131231
    include<bits/stdc++.h>includeusingnamespacestd;intkg(stringa){while(a.find("")>=0&&a.find("")<=a.size()){a.replace(a.find(""),1,"");}}intjia(stringa){intno1=kg(0.a.find(&qu......
  • 勘误《新概念》III
    ----------------------------BookIII朗文外研社新概念英语(新版)1997年10月第一版2005年7月第36次印刷ISBN7-5600-1348-1责任编辑:(朗文)王德厚梅丹心(外研社)孙蓓任小玫----------------------------错误编号      出现页码         ......
  • P-III曲线水文频率计算程序(方法)
    P-III曲线水文频率计算程序(方法) 最近遇到水文频率曲线拟合计算相关的问题,在网上查阅了一下,毕竟是专业性比较强的知识内容,好像没有比较系统全面的资料,一时兴起,做了一些研究,总结了一下所了解的一些计算方法以及能够帮助我们解决实际问题的辅助计算软件,并作了对比分析,主要情况如下......
  • python123——模拟生成微软序列号
    模拟生成微软序列号描述微软产品一般都一个25位的序列号,是用来区分每份微软产品的产品序列号。产品序列号由五组被“-”分隔开,由字母数字混合编制的字符串组成,每组字符串是由五个字符串组成。如:36XJE-86JVF-MTY62-7Q97Q-6BWJ2每个字符是取自于以下24个字母及数字之中的一个:BCE......
  • selenium等待元素加载,元素操作,执行js,切换选项卡,前进后退,异常处理,登录cnblogs,抽
    1selenium等待元素加载......