文章目录

  • 买卖股票的最佳时机
    • 【题目】
    • 【我的方法】
      • 执行结果:
  • 动态规划算法
    • 1、状态定义
    • 2、设置数组边界值
    • 3、推导状态转换方程。
      • 参考代码
        • 执行结果:
        • 复杂度分析:
          • 时间复杂度
          • 空间复杂度
    • *进行空间优化:
      • 参考代码V2:
        • 复杂度分析:
          • 空间复杂度
          • 时间复杂度

买卖股票的最佳时机

【题目】

给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。
设计一个算法来计算你所能获取的最大利润。返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。

示例 1:

  • 输入:[7,1,5,3,6,4]
  • 输出:5
  • 解释:在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。
  • 注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格;同时,你不能在买入前卖出股票。

示例 2:

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

提示:

1 <= prices.length <= 105
0 <= prices[i] <= 104


来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

【我的方法】

  • 对于只有两个元素的数组[a2,a1],利润为max(a1-a2,0)
  • 对于三个元素的数组[a3,a2,a1],利润要么是[a2,a1]的利润,要么是max(a2,a1)-a3
  • 因此可推出有n个元素的数组的最大利润
class Solution:def maxProfit(self, prices: List[int]) -> int:if len(prices)<2:return 0else:res = 0tempmax=prices[-1]i = len(prices)-2while(i>=0):if tempmax>prices[i]:res = max(res,tempmax-prices[i])else:tempmax=prices[i]  # 记录当前元素右侧最大的数i-=1return res

执行结果:

  • 执行用时:224 ms, 在所有 Python3 提交中击败了82.94%的用户

  • 内存消耗:23.5 MB, 在所有 Python3 提交中击败了52.35%的用户


动态规划算法

1、状态定义

创建一个一维数组或者二维数组,保存每一个子问题的结果。在此问题中,dp[i][j]表示第i天结束后手上的现金,j=0表示不持股,j=1表示持股。

2、设置数组边界值

一维数组就是设置第一个数字,二维数组就是设置第一行跟第一列的值。在此问题中,dp[0][0]=0,dp[0][1]=0-prices[0],因为第1天的股票价格当成初始的0。

3、推导状态转换方程。

也就是说找到每个状态跟上一个状态的关系,根据状态转化方程写出代码。在此问题中,第i天的状态只与第i-1天有关。

  • dp[i][0]表示第i天不持股,分两种情况:

    • 第i-1天也不持股,即今天无行为。
    • 第i-1天持股,则今天卖出股票。
  • dp[i][1]表示第i天持股,分两种情况:
    • 第i-1天不持股,则今天为买入股票。(注意:只允许交易一次,因此手上的现金数就是当天的股价的相反数
    • 第i-1天也持股,则今天无行为。
  1. 返回需要的值,一般是数组的最后一个或者二维数组的最右下角。

参考代码

class Solution:def maxProfit(self, prices: List[int]) -> int:length=len(prices)dp = [[0 for i in range(2)]]*lengthdp[0][1]=-prices[0]for i in range(1,length):dp[i][0]=max(dp[i-1][0],dp[i-1][1]+prices[i])dp[i][1]=max(dp[i-1][1],-prices[i])return dp[length-1][0]  # 如果最后一天还不卖则利润为0

执行结果:

  • 执行用时:508 ms, 在所有 Python3 提交中击败了7.74%的用户

  • 内存消耗:22.7 MB, 在所有 Python3 提交中击败了99.48%的用户

复杂度分析:

*进行空间优化:

空间优化只看状态转移方程

状态转移方程里下标为 i 的行只参考下标为 i - 1 的行(即只参考上一行),并且:

  • 下标为 i 的行并且状态为 0 的行参考了上一行状态为 0 和 1 的行。
  • 下标为 i 的行并且状态为 1 的行只参考了上一行状态为 1 的行。

参考代码V2:

class Solution:def maxProfit(self, prices: List[int]) -> int:length=len(prices)dp = [0]*2dp[1]=-prices[0]for i in range(1,length):dp[0]=max(dp[0],dp[1]+prices[i])dp[1]=max(dp[1],-prices[i])return dp[0]

复杂度分析:

【2021/5/17 刷题笔记】买卖股票的最佳时机与动态规划相关推荐

  1. LeetCode刷题记录——买卖股票的最佳时机

    目录 1. 买卖股票的最佳时机 2. 买卖股票的最佳时机II 相信许多小伙伴在笔试和面试的时候会经常遇到 买卖股票的最佳时机的相关题目,看了这篇文章,你将会一次性掌握该系列题目的解法. 废话不多说,且 ...

  2. 力扣leetcode之Java刷题121买卖股票的最佳时机

    121. 买卖股票的最佳时机 题目:   给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格.   你只能选择某一天买入这只股票,并选择在未来的某一 ...

  3. 每日一题之买卖股票的最佳时机

    买卖股票的最佳时机 题目链接 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格. 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日 ...

  4. 【练习】2021下半年数据结构刷题笔记和总结 (三)栈 队列 链表 枚举算法

    题目来自书或者网站. 解密QQ 号--队列 回文字符串---栈 火柴棍等式 输入数字n,要求输出从1~n的全排列 [力扣]给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 ...

  5. 【练习】2021下半年数据结构刷题笔记和总结 (二) 树、查找-- 不同的排序算法、二叉排序树 平衡二叉树、哈希表查找、线索二叉树、

    记录自己下半年写题目的记录.题目来自书或者网站. 练习(一)的地址: https://blog.csdn.net/qq_41358574/article/details/117098620?ops_r ...

  6. 【练习】2021下半年数据结构刷题笔记和总结 (一)(图和动态规划)

    文章目录 1.编程将一个字符串中所有空格替换为"%20" 2.定两个字符串,判断一个字符串是否是另一个字符串的排列 3.求一个房间内有数个钩子,给定一定长度的绳索,要把所有的钩子用 ...

  7. 力扣122题:买卖股票的最佳时机 II

    给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格.设计一个算法来计算你所能获取的最大利润.你可以尽可能地完成更多的交易(多次买卖一支股票). **注意:**你不能同时参与多笔交易(你必须 ...

  8. [剑指offer]面试题第[63]题[Leetcode][第121题][JAVA][买卖股票的最佳时机][动态规划][暴力]

    [问题描述][简单] [解答思路] 1. 暴力 时间复杂度:O(N^2) 空间复杂度:O(1) public class Solution {public int maxProfit(int pric ...

  9. 108. Leetcode 188. 买卖股票的最佳时机 IV (动态规划-股票交易)

    步骤一.确定状态: 确定dp数组及下标含义 dp[i] 表示的是在第i天可以获取的最大利润,每天会有持有股票和不持有 股票两种状态,这个是第二维度,还是用0和1表示. 而对于每一种状态, 这里还会有交 ...

最新文章

  1. linux和windows双系统引导,windows和linux双系统引导问题
  2. sublime_text配置php调试环境,SublimeText2配置PHP调试环境(在windows环境下)
  3. Lucene学习总结之六:Lucene打分公式的数学推导
  4. 看一眼凌晨四点的哈佛,就会明白中国缺什么
  5. python中的max_row_Openpyxl max_row和max_column错误地报告了一个较大的figu
  6. 设置数字范围的html语言,JavaScript奇技淫巧44招【实用】
  7. Bash脚本教程之数组
  8. flowable DMN规则引擎几种类型解释_04
  9. 【Go语言】【15】GO语言的面向对象
  10. 写代码抽取代码的技巧
  11. Python 第三方扩展库
  12. 用python生成九九乘法表的指令_Python中生成九九乘法表的方法有哪几种?
  13. 数据结构与算法的分析
  14. 2.Rails程序框架
  15. 微信小程序学习笔记(阶段一)
  16. postgis/postsql 导入dem栅格数据到数据库
  17. ipq6010 qsdk spf11.5 64bit编译
  18. cad线性标注命令_CAD线性标注快捷键是什么,怎么使用
  19. Java实现 LeetCode 707 设计链表(环形链表)
  20. Documentation/timers/hpet.txt

热门文章

  1. LLMs:《Efficient and Effective Text Encoding for Chinese LLaMA and Alpaca》翻译与解读
  2. CSS中position属性面试题目超详细讲解
  3. Web前端面试题汇总(持续更新...)
  4. DEAP(Database for Emotion Analysis using Physiological Signals)介绍
  5. 基于MATLAB的语音分析处理系统设计
  6. Qin Shi Huang's National Road System HDU - 4081
  7. 51单片机入门——(新)简易数字时钟
  8. 高级软件工程-课程总结
  9. 世界杯 | 中国首次承建世界杯主赛场,基建狂魔用BIM征服世界杯
  10. docker 多开端口