当前位置:网站首页>leetcode系列(一):买卖股票
leetcode系列(一):买卖股票
2022-07-27 05:13:00 【Mr_health】
1. 第一题:122. 买卖股票的最佳时机 II
按照我自己的渐进思路写出四种方法,前三种都是动态规划,最后一种是贪心。
方法1:二维动态矩阵
思路是维护一个n*2的动态矩阵,dp[i][0]表示第i天不持有股票的最大利润,dp[i][1]表示第i天持有股票的最大利润。那么则有转移方程如下:
- 第i天持有股票的最大利润 = max(保持i-1天持有股票, i-1天不持有股票 + 今天买入)
- 第i天不持有股票的最大利润 = max(保持i-1天不持有股票, i-1天持有股票 + 今天卖出)
写出公式就是:


代码如下:
def maxProfit(self, prices: List[int]) -> int:
n = len(prices)
dp =[[0 for i in range(2)] for j in range(n)]
dp[0][1] = -prices[0] #买入(持有)
dp[0][0] = 0 #手上没有股票(不持有)
for i in range(1,n):
dp[i][1] = max(dp[i-1][1], dp[i-1][0] - prices[i])
dp[i][0] = max(dp[i-1][0], dp[i-1][1] + prices[i])
return dp[-1][0]python的提交结果:

方法2:两个一维动态矩阵
转移方程是一样的,代码如下:
def maxProfit(self, prices: List[int]) -> int:
n = len(prices)
buy = [0] * n
free = [0] * n
buy[0] = -prices[0]#买入
for i in range(1,n):
buy[i] = max(buy[i-1], free[i-1] - prices[i])
free[i] = max(free[i-1], buy[i-1] + prices[i])
return free[-1]提交结果,速度有所提升

方法3:取消数组
通过方法2可以看到,第i次的结果只与i-1次有关,与前面的无关,因此我们可以只保留前一次的记过即可。
def maxProfit(self, prices: List[int]) -> int:
n = len(prices)
buy = -prices[0]
free = 0
for i in range(1,n):
buy = max(buy, free - prices[i])
free = max(free, buy + prices[i])
return free我们看一下代码,buy = max(buy, free - prices[i])先更新的,free是后更新的。正常来说更新free用到的是前一天的buy,如果buy先更新的话,那么free更新所用的就不是前一天的buy,而是今天的buy。之所以这样没有问题,是因为同一天可以买入再卖出
方法4:贪心
贪心的方法可以这么理解,我们要求最大利润,就必然要使得卖出的价格高于买入的价格,即prices[latest] > prices[pre]。我们遍历的最小单元跨度为1,即就是对于相邻的区间1,如果prices[i+1] > prices[i],我们就可以买入卖出获利。
这样做的依据同样是:同一天可以买入再卖出。
我们是想一个场景,第一天的价格为7,第二天的价格为1,显然我们不能在第一天买入,在第二天卖出,会亏本的,所以应该在第二天买入。如果以第一天买入的起始,那么实际上第二天买入就= 一天买入并卖出 + 第二天买入。
def maxProfit(self, prices: List[int]) -> int:
n = len(prices)
profit = 0
for i in range(1,n):
profit += max(0, prices[i] - prices[i-1])
return profit2. 第二题:121. 买卖股票的最佳时机
这一题比上一题稍微简单一点,因为只允许买卖一次,并且不能在同一天买入卖出。
方法1:暴力穷举
嵌套两个循环,速度较慢
方法2:二维动态矩阵
思路是维护一个n*2的动态矩阵,dp[i][0]表示第i天不持有股票的最大利润,dp[i][1]表示第i天持有股票的最大利润。那么则有转移方程如下:
- 第i天持有股票的最大利润 = max(保持i-1天持有股票,今天第一次买入)
- 第i天不持有股票的最大利润 = max(保持i-1天不持有股票, i-1天持有股票 + 今天卖出)
红色字体也是与上一题转移方程不同的地方,原因是只能买一次。
def maxProfit(self, prices: List[int]) -> int:
n = len(prices)
dp = [[0 for j in range(2)] for i in range(n)]
dp[0][0] = 0
dp[0][1] = -prices[0] #持有
for i in range(1,n):
dp[i][1] = max(dp[i-1][1],-prices[i]) #第一次买
dp[i][0] = max(dp[i-1][0], dp[i-1][1] + prices[i]) #卖出去
return dp[-1][0]方法3:两个一维动态矩阵
def maxProfit(self, prices: List[int]) -> int:
n = len(prices)
buy = [0] * n
sell = [0] * n
buy[0] = -prices[0]
for i in range(1,n):
buy[i]= max(buy[i-1],-prices[i]) #第一次买
sell[i] = max(sell[i-1], buy[i-1] + prices[i]) #卖出去
return sell[-1]方法4:取消数组
def maxProfit(self, prices: List[int]) -> int:
n = len(prices)
buy = -prices[0]
sell = 0
for i in range(1,n):
buy= max(buy,-prices[i]) #第一次
sell = max(sell, buy + prices[i]) #卖出去
return sell边栏推荐
- 16.过拟合欠拟合
- MySQL limit分页查询优化实践
- MySQL快速比较数据库表数据
- Handler操作记录 Only one Looper may be created per thread
- Emoji表情符号用于文本情感分析-Improving sentiment analysis accuracy with emoji embedding
- Deploy redis with docker for high availability master-slave replication
- 数字图像处理第四章——频率域滤波
- Day 17.The role of news sentiment in oil futures returns and volatility forecasting
- GBASE 8C——SQL参考6 sql语法(13)
- Day14. 用可解释机器学习方法鉴别肠结核和克罗恩病
猜你喜欢

数字图像处理第四章——频率域滤波

Seektiger's okaleido has a big move. Will the STI of ecological pass break out?

Minimum handling charges and margins for futures companies

Specific matters of opening accounts of futures companies

基于深度神经网络的社交媒体用户级心理压力检测

Emoji Emoji for text emotion analysis -improving sentimental analysis accuracy with Emoji embedding

Day 9. Graduate survey: A love–hurt relationship

Minio8.x version setting policy bucket policy

Jenkins build image automatic deployment

3.分类问题---手写数字识别初体验
随机推荐
Gbase 8C - SQL reference 6 SQL syntax (3)
Rk3288 board HDMI displays logo images of uboot and kernel
vim编辑器全部删除文件内容
6.维度变换和Broadcasting
Day 6. Analysis of the energy transmission process of network public opinion in major medical injury events * -- Taking the "Wei Zexi incident" as an example
3.分类问题---手写数字识别初体验
GBASE 8C——SQL参考6 sql语法(11)
MySQL查询操作索引优化实践
Day 17.The role of news sentiment in oil futures returns and volatility forecasting
DDD领域驱动设计笔记
Cap principle
7.合并与分割
Minio fragment upload lifting fragment size limit - chunk size must be greater than 5242880
常用adb命令汇总 性能优化
【MVC架构】MVC模型
Deploy redis with docker for high availability master-slave replication
Andorid detects GPU rendering speed and over rendering
「中高级试题」:MVCC实现原理是什么?
GBASE 8C——SQL参考6 sql语法(6)
dpdk 网络协议栈 vpp OvS DDos SDN NFV 虚拟化 高性能专家之路