@Author:Runsen

@Date:2020/09/26

悄然间时间来到十月,不禁感慨,过去的这一个月浪的‘无知’,我其实是一个很没有原则的人,做的很多事情都是随心所欲,骨子里放纵不羁爱自由。可能是最后一年的时间了吧,自己在学业上没有了太多心劲,抱着一种‘再不疯狂就老了’的心态开始游戏人生,放纵自我,或许没有那么严重,但确实实实在在的放飞自我了。

还有一个关键原因是每次想到自己专业都会一阵心痛,宿舍成天游戏,我还要为补考和知行分焦虑,这世间我仿佛觉得大一自己入IT的门,但又不是自己的专业,都是凭自己一天一天积累而来。毕业却为毕业证而焦虑的恐慌,学分绩点1.47,专业排名倒数第七,我哪里差了?都不知道我大学这么努力,还要给人看死。

不说了。赶紧开干Leetcode的股票系列。前面都是发牢骚!自己不满足自己的现状而已!

在极客时间中,我知道动态规划必须要面对股票系列,背包系列差不多了,那就上吧。

文章目录

  • 买卖股票的最佳时机(买一次)
  • 买卖股票的最佳时机(买N次)
  • 买卖股票的最佳时机(买2次)
  • 买卖股票的最佳时机(买k次)
  • 买卖股票的最佳时机(买N次加CD冷却时间)
  • 买卖股票的最佳时机(买N次加手续费)
  • 后言(杂聊)

买卖股票的最佳时机(买一次)

这是Leetcode的第121题: 买卖股票的最佳时机(买一次)

题目不说了,就是只能买一次,

class Solution:def maxProfit(self, prices: List[int]) -> int:# dp的状态转移方程:dp[i] = max(dp[i-1],prices[i]-minprice)n = len(prices)if n == 0: return 0dp = [0] * nminprice = prices[0]for i in range(1,n):minprice = min(minprice,prices[i])dp[i] = max(dp[i-1],prices[i]-minprice)return dp[-1]

买卖股票的最佳时机(买N次)

这是Leetcode的第122题: 买卖股票的最佳时机(买N次)

那么dp就需要开一个维度来表示当天是买还是卖。

class Solution:def maxProfit(self, prices: List[int]) -> int:'''可以买卖多次 dp[i][j]dp[i][0] 表示前 i天的最大利润,第i天不买,那么dp转移方程取决于i-1天是有股票还是没有股票dp[i][0] = max(dp[i-1][0],dp[i-1][1]+prices[i])dp[i][1] 表示前 i天的最大利润,第i天必须买, 那么dp转移方程取决于i-1天是有股票还是没有股票dp[i][1] = max(dp[i-1][0]-prices[i],dp[i-1][1])'''n = len(prices)if n == 0: return 0dp = [[0]*2 for _ in range(n)]dp[0][0] = 0dp[0][1] = -prices[0]for i in range(1,n):dp[i][0] = max(dp[i-1][0],dp[i-1][1]+prices[i])dp[i][1] = max(dp[i-1][0]-prices[i],dp[i-1][1])return dp[-1][0]# 找到所有的上升区间,计算每个上升区间的价格差,直接节约了空间复杂度 为O(1)# 贪心做法n = len(prices)profit = 0if n == 0 : return 0for i in range(1,n):if prices[i] > prices[i-1]:profit += prices[i] - prices[i-1]return profit# 最好的做法就是有一个变量储存没有股票的最大利润和有股票的最大利润,然后不断地维护# cash表示第i天结束,没有股票的最大利润# hold表示第i天结束,有股票的最大利润cash, hold = 0, -prices[0]for i in range(1,len(prices)):cash = max(cash,hold+prices[i])hold = max(hold,cash-prices[i])return cash

买卖股票的最佳时机(买2次)

这是Leetcode的第123题: 买卖股票的最佳时机(买2次)

class Solution:def maxProfit(self, prices: List[int]) -> int:'''dp[i][k][XX]  i 表示第i的最大利润,k表示第i天之前你买了多少次,X表示第i天是否有股票 0 ,1 p[i][k][0] = max(dp[i-1][k][0], dp[i-1][k][1]+prices[i])dp[i][k][1] = max(dp[i-1][k][1], dp[i-1][k-1][0]-prices[i])'''if not prices:return 0n = len(prices)# 初始化状态dp = [[[0]*2 for _ in range(3)] for _ in range(n)]for k in range(3):# 第一天买入股票dp[0][k][1] = -prices[0]# 从 i=1 处开始迭代for i in range(1, n):for k in range(1, 3):dp[i][k][0] = max(dp[i-1][k][0], dp[i-1][k][1]+prices[i])dp[i][k][1] = max(dp[i-1][k][1], dp[i-1][k-1][0]-prices[i])return dp[-1][2][0]

买卖股票的最佳时机(买k次)

这是Leetcode的第188题: 买卖股票的最佳时机(买k次)

注释写得很详细了。

class Solution:def maxProfit(self, k: int, prices: List[int]) -> int:# @Author:Runsen#dp[i][j][0] 今天是第i天 进行 j次 交易 手上没有股票#dp[i][j][1] 今天是第i天 进行 j次 交易 手上有股票if k == 0 or len(prices) < 2:return 0n = len(prices)res = []# 如果k的次数大于n//2,那么就是直接计算利润,第一天买,第二天就卖,然后第二天在买。if k > n // 2: max_profit = 0for i in range(1,n):profit = prices[i] - prices[i - 1]# 如果第二天比第一天高,那就直接加入if profit > 0:max_profit += profitreturn max_profit# 下面就是Leetcode第123的代码 dp[i][j][0]dp = [[[0] * 2 for _ in range(k + 1)] for _ in range(n)]for i in range(k + 1):# 第一天买入股票dp[0][i][1] = - prices[0]for i in range(1, n):for k in range(1, k+1):dp[i][k][0] = max(dp[i-1][k][0], dp[i-1][k][1]+prices[i])dp[i][k][1] = max(dp[i-1][k][1], dp[i-1][k-1][0]-prices[i])# 求dp[i][k][0] 的最大,这里我直接开数组for m in range(k + 1):res.append(dp[-1][m][0])return max(res)

买卖股票的最佳时机(买N次加CD冷却时间)

这是Leetcode的第309题: 买卖股票的最佳时机(买N次加CD冷却时间)

注释写得很详细了。

class Solution:def maxProfit(self, prices: List[int]) -> int:# 如果设置dp的状态? 就是关键。冷冻期其实就是CD技能的时间。# dp[i][0]表示第i天结束之后,我有股票的最大收益。那么有可能i-1天我本来就有股票,今天的价不好,我不卖了,或者昨天我没有股票,但我今天可以买了股票,说明今天不是冷冻期。# dp[i][0] = max(dp[i-1][0], dp[i-1][2] - prices[i])# dp[i][1]表示第i天结束之后,我没有股票,明天就是冷冻期,也就是昨天有股票,今天运气好,价格高,我刚刚卖了股票这一种可能。# dp[i][1] = dp[i-1][0] + prices[i]# dp[i][2]表示第i天结束之后,我没有股票,但是明天不在冷冻期,也就是今天我不买股票,有可能因为我昨天刚刚卖了,今天就是冷冻期,我买不了。也有可能,昨天的我可能没打算买,今天又不买。# dp[i][2] = max(dp[i-1][1] ,dp[i-1][2])if not prices: return 0n = len(prices)# 第0天dp[0][0]要买是第一个股dp = [[-prices[0], 0, 0]] + [[0] * 3 for _ in range(n - 1)]for i in range(1, n):dp[i][0] = max(dp[i-1][0], dp[i-1][2] - prices[i])dp[i][1] = dp[i-1][0] + prices[i]dp[i][2] = max(dp[i-1][1] ,dp[i-1][2])return max(dp[-1][1], dp[-1][2])

买卖股票的最佳时机(买N次加手续费)

这是Leetcode的第714题: 买卖股票的最佳时机(买N次加手续费)

注释写得很详细了。

# 就是在dp[i][0]减去手续费而已
class Solution:def maxProfit(self, prices: List[int], fee: int) -> int:n = len(prices)if n == 0: return 0dp = [[0]*2 for _ in range(n)]dp[0][0] = 0dp[0][1] = -prices[0]for i in range(1,n):dp[i][0] = max(dp[i-1][0],dp[i-1][1]+prices[i]-fee)dp[i][1] = max(dp[i-1][0]-prices[i] ,dp[i-1][1])return dp[-1][0]class Solution:def maxProfit(self, prices: List[int], fee: int) -> int:# cash表示第i天结束,没有股票的最大利润# hold表示第i天结束,有股票的最大利润cash, hold = 0, -prices[0]for i in range(1,len(prices)):cash = max(cash,hold+prices[i]-fee)hold = max(hold,.cash-prices[i])return cash

后言(杂聊)

上面就是今天的股票系列刷题,今天也就刷了dp的Leetcode题。

现在爱上生活,爱上每天的细节,爱上写日常,尝试给自己降压,写鼓励的话语。

九月,不敢浪,也浪不起。我决定每天在每篇博客中添加keep打卡

生活这趟旅途,你我都是行人,不会有人永远与其他人都是背道而驰。至于活着的意义,本就没什么标准答案,真的开心就好,当你感到无聊那就改变,当你感到厌倦那就停一停。

股票系列,动态规划,加油,九月太浪了,十月不许浪相关推荐

  1. leetcode 买卖股票系列题目总结

    总结:买卖股票系列题目 1.买卖股票的最佳时机(简单) 121. 买卖股票的最佳时机 难度简单1093 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 如果你最多只允许完成一笔交易( ...

  2. 【leetcode买卖股票系列问题】多次买卖/手续费/冻结期

    一.目录 一.目录 二.股票系列问题 1.买卖股票的最佳时机(121题) 1.1.题目 1.2.思路 1.3.代码实现(1种) 2.买卖股票的最佳时机II(122题) 2.1.题目 2.2.思路 2. ...

  3. “动态规划”这词太吓人,其实可以叫“状态缓存”

    摘要:平时练习算法题学习算法知识时,经常会发现题解里写着"动态规划",里面一上来就是一个复杂的dp公式,对于新人来说除了说声"妙啊",剩下就是疑惑,他是怎么想到 ...

  4. dp:股票系列I II III IV 含冷冻期 含手续费

    买卖股票的最佳时机 https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock/ 给定一个数组 prices ,它的第 i 个元素 ...

  5. 趣学算法系列-动态规划

    趣学算法系列-动态规划 声明:本系列为趣学算法一书学习总结内容,在此推荐大家看这本算法书籍作为算法入门, 原作者博客链接,本书暂无免费电子版资源,请大家支持正版,更多实例分析请查看原书内容 第四章 动 ...

  6. LeetCode动态规划股票系列整理

    写在前面 股票感觉是LeetCode动态规划中系列最多的一类,交易次数不同,有冷冻期,含手续费,让买卖的最佳时机千奇百怪,但是只要掌握dp的方法,解决起来还是有套路可循的.依据dp的常规思想,股票问题 ...

  7. python购买股票_动态规划python实现-买股票的最佳时机

    买股票的最佳时机(动态规划python实现) 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大 ...

  8. skt7850鸿蒙策略,LPL夺洲际赛冠军:SSG、SKT太浪了吧 这是傲慢给的教训

    LPL以3:1的比分战胜强敌LCK,获得"亚洲最强战区"称号.这个结果让韩国观众大失所望,他们在Inven论坛发表了自己的看法.(顺序是从第一局到第四局的热评) 三星选手和教练组看 ...

  9. iphone11系列的尺寸_iPhone12太贵,苹果双11销量还得看iPhone11,3XXX起有戏!

    原标题:iPhone12太贵,苹果双11销量还得看iPhone11,3XXX起有戏! 买手机有个惯例,就是买新不买旧,新款手机无论是颜值还是性能,往往都超出老款不少.但有个品牌例外,那就是苹果.得益于 ...

最新文章

  1. 在批处理模式下使用mysql_3.5 在批处理模式下使用mysql
  2. Google 图片搜索的原理是什么?
  3. 记住,永远不要在MySQL中使用“utf8”-转
  4. web api接口开发实例_小程序开发如何调用 API 接口,以豆瓣电影为例
  5. flink sql实现interval join的图解
  6. 大数据之-Hadoop3.x_MapReduce_CombineTextInputFormat---大数据之hadoop3.x工作笔记0108
  7. SAP License:MIRO
  8. redux-saga中间件的安装和使用-(三)
  9. 雨过天晴电脑保护系统校园版
  10. C# Hprose轻量级、跨语言、跨平台的面向对象的高性能远程动态通讯中间件
  11. 激光甲烷传感器应用及优势
  12. 杭州十二条经典登山路线
  13. java判断日文_如何判断字符串中含有日文字符
  14. 九宫格拼图,避免不可还原
  15. 计算机考试怎么考申论,公务员考试申论评分标准,这些你都知道吗?
  16. leetcode 179 最大数
  17. 2015062402 - 求伯君
  18. 笔记3:关于VBS整人代码的浅谈
  19. 吃货联盟系统 C++实现
  20. Python综合评价模型(五)专家评分法

热门文章

  1. php微信撤回消息,78行Python代码实现现微信撤回消息功能
  2. ESD静电二极管,在汽车电子中的应用
  3. java跳转_java 跳转语句
  4. python缺少dll文件_python37.dll文件下载,金山毒霸dll修复工具帮您解决文件丢失导致“python37.dll找不到”的系统问题...
  5. ★☆★ lc 847. Shortest Path Visiting All Nodes
  6. PCL中有哪些可用的PointT类型(4)
  7. selenium学习笔记(一)
  8. Exchange环境搭建心得
  9. Sublime Text 3 python和Package Control配置方法
  10. thinkphp用phpexcel读取excel,并修改列中的值,再导出excel,带往excel里写入图片