from typing import List class Solution: def maxProfit(self, prices: List[int]) -> int: length = len(prices) if length <= 1:return 0 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][2] = float("-inf") dp[0][0][1] = float("-inf") # 第一天同样不可能即持股,又卖出 dp[0][1][2] = float("-inf") dp[0][1][1] = float("-inf") for index in range(1,length): # 没有持股和卖出,利润为0 dp[index][0][0] = 0 # 持股不卖出,有可能是今天持股,有可能昨天已经持股 dp[index][1][0] = max(dp[index - 1][0][0] - prices[index],dp[index - 1][1][0]) # 今天没有股票且卖出两次,有可能是今天卖出,也有可能是昨天就卖出 dp[index][0][2] = max(prices[index] + dp[index - 1][1][1],dp[index - 1][0][2]) # 今天没有股票且卖出一次,有可能是今天卖出,也有可能是昨天卖出 dp[index][0][1] = max(prices[index] + dp[index - 1][1][0],dp[index - 1][0][1]) # 今天有股票且卖出一次,有可能是今天买入,有可能是昨天就买入 dp[index][1][1] = max(dp[index - 1][0][1] - prices[index],dp[index - 1][1][1]) # 今天有股票且卖出两次,不可能 dp[index][1][2] = float("-inf") print(dp) return max(dp[-1][0][2],dp[-1][0][1],dp[-1][0][0]) # 通过正序和逆序遍历求出两个最大利润,然后相加找出最大的那个。 # 第二个答案不是很懂,不知道怎么证明其正确性 def maxProfit(self, prices: List[int]) -> int: length = len(prices) if length <= 1:return 0 min_price,max_price = prices[0],prices[-1] profit1,profit2 = [0] * length,[0] * length for index in range(1,length): min_price = min(min_price,prices[index]) profit1[index] = max(profit1[index - 1],prices[index] - min_price) max_price = max(max_price,prices[length - 1 - index]) profit2[length - index - 1] = max(profit2[length - index],max_price - prices[length - index - 1]) profit = profit1[-1] for index in range(length): profit = max(profit1[index] + profit2[index],profit) return profit A = Solution() print(A.maxProfit([3,3,5,0,0,3,1,4])) print(A.maxProfit([1,2,3,4,5]))
当前位置:
首页 > temp > python入门教程 >
-
123买卖股票的最佳时机III
出处:https://www.cnblogs.com/cong12586/p/13225532.html
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
SQL Server -- 解决存储过程传入参数作为s
关于JS定时器的整理
JS中使用Promise.all控制所有的异步请求都完
js中字符串的方法
import-local执行流程与node模块路径解析流程
检测数据类型的四种方法
js中数组的方法,32种方法
前端操作方法
数据类型
window.localStorage.setItem 和 localStorage.setIte
如何完美解决前端数字计算精度丢失与数