算法[动态规划]---买卖股票最佳时机

这篇具有很好参考价值的文章主要介绍了算法[动态规划]---买卖股票最佳时机。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


1、题目:

给你一个整数数组 prices,其中 prices[i] 表示某支股票第 i 天的价格。
在每一天,你可以决定是否购买和/或出售股票。你在任何时候最多只能持一股股票。你也可以先购买,然后在同一天出售。
返回你能获得的最大利润 。


2、分析特点:

  • 题目要求:在任何时候最多只能持一股股票 ==> 考虑到「不能同时参与多笔交易」,因此每天交易结束后只可能存在手里 有一支股票或者没有股票的状态
  • 有和没有股票的状态 ==> 动态规划

定义状态dp[0] 表示第天交易完后手里没有股票的最大利润,d[1] 表示第天交易完后手里持有一支股票的最大利润(从0开始)。

考虑dp[i][0] 的转移方程,如果这一天交易完后手里没有股票,那么可能的转移状态为前一天已经没有股票,即 dp[i-1][0],
或者前一天结束的时候手里持有一支股票,即 dp[i-1][1],这时候我们要将其卖出,并获得 prices[i] 的收益。
因此为了收益最大化,我们列出如下的转移方程:

算法[动态规划]---买卖股票最佳时机,算法,动态规划,状态,转移方程,数据结构,java

再来考虑dp[i][1],按照同样的方式考虑转移状态,那么可能的转移状态为前一天已经持有一支股票,即 dp[i-1][1],或者前一天结束时还没有股票,即 dp[i-1][0],这时候我们要将其买入,并减少prices[i]的收益。可以列出如下的转移方程:

算法[动态规划]---买卖股票最佳时机,算法,动态规划,状态,转移方程,数据结构,java

对于初始状态,根据状态定义我们可以知道第0天交易结束的时候 dp[0][0] =0,dp[0][1]=-prices0。
因此,我们只要从前往后依次计算状态即可。由于全部交易结束后,持有股票的收益一定低于不持有股票的收益,因此这时候 dp[n-1][0] 的收益必然是大于 dp[n-1][0] 的,最后的答案即为dp[n-1][0]

3、特点:

本题动态规划法的思路解析:

因为,从最后一天往前看,分成四种情况:

A:前一天有股票,并卖出 – 剩余股票数0

B:前一天没有股票,并不买入 – 剩余股票数0

C:前一天有股票,并不买出 – 剩余股票数1

D:前一天没有股票,并买入 – 剩余股票数1

所以:

  • 当剩余股票数0时,最大的利润是max(A, B)
  • 当剩余股票数1时,最大的利润是max(C, D)

4、代码:

class Solution {
    public int maxProfit(int[] prices) {
        int n = prices.length;
        int[][] dp = new int[n][2];
        dp[0][0] = 0;
        dp[0][1] = -prices[0];
        for (int i = 1; i < n; ++i) {
            dp[i][0] = Math.max(dp[i - 1][0], dp[i - 1][1] + prices[i]);
            dp[i][1] = Math.max(dp[i - 1][1], dp[i - 1][0] - prices[i]);
        }
        return dp[n - 1][0];
    }
}

注意到上面的状态转移方程中,每一天的状态只与前一天的状态有关,而与更早的状态都无关,因此我们不必存储这些无关的状态,只需要将 dp[i-1][0]和dp[i-1][0] 存放在两个变量中,通过它们计算出dp[i][0] 和 dp[i][1] 并存回对应的变量,以便于第 i+1 天的状态转移即可。

4、复杂度分析:

  • 时间复杂度:O(n),其中 nnn 为数组的长度。一共有 2n 个状态,每次状态转移的时间复杂度为 O(1),因此时间复杂度为 O(2n)=O(n)。
  • 空间复杂度:O(n)。我们需要开辟 O(n) 空间存储动态规划中的所有状态。如果使用空间优化,空间复杂度可以优化至 O(1)。

5、总结:

本题动态规划法的思路解析---有股票和没股票结合买入卖出的情况考虑状态

因为,从最后一天往前看,分成四种情况:

A:前一天有股票,并卖出 – 剩余股票数0

B:前一天没有股票,并不买入 – 剩余股票数0

C:前一天有股票,并不买出 – 剩余股票数1

D:前一天没有股票,并买入 – 剩余股票数1

所以:

  • 当剩余股票数0时,最大的利润是max(A, B)
  • 当剩余股票数1时,最大的利润是max(C, D)




如果本文对你有帮助的话记得给一乐点个赞哦,感谢!文章来源地址https://www.toymoban.com/news/detail-708618.html

到了这里,关于算法[动态规划]---买卖股票最佳时机的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • LeetCode:121.买卖股票的最佳时机——动态规划

    🍎道阻且长,行则将至。🍓 🌻算法,不如说它是一种思考方式🍀 算法专栏: 👉🏻123 关于动态规划:LeetCode:322. 零钱兑换——动态规划从案例入门 题目描述 :给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只

    2023年04月17日
    浏览(26)
  • 【Day53】代码随想录之动态规划part10——买卖股票的最佳时机、买卖股票的最佳时机II

    昨天已经把打家劫舍的问题解决了,最后一个题目涉及到树形dp比较难(等到二刷的时候再重点看下),今天的任务是解决股票问题。 今日任务: 121.买卖股票的最佳时机 122.买卖股票的最佳时机II Leetcode题目:【121.买卖股票的最佳时机】 因为此题中买卖股票只能买卖一次。

    2024年03月15日
    浏览(83)
  • 【学会动态规划】最佳买卖股票时机含冷冻期(15)

    目录 动态规划怎么学? 1. 题目解析 2. 算法原理 1. 状态表示 2. 状态转移方程 3. 初始化 4. 填表顺序 5. 返回值 3. 代码编写 写在最后: 学习一个算法没有捷径,更何况是学习动态规划, 跟我一起刷动态规划算法题,一起学会动态规划! 题目链接:309. 最佳买卖股票时机含冷冻

    2024年02月14日
    浏览(42)
  • 【学会动态规划】买卖股票的最佳时机 IV(18)

    目录 动态规划怎么学? 1. 题目解析 2. 算法原理 1. 状态表示 2. 状态转移方程 3. 初始化 4. 填表顺序 5. 返回值 3. 代码编写 写在最后: 学习一个算法没有捷径,更何况是学习动态规划, 跟我一起刷动态规划算法题,一起学会动态规划! 题目链接:188. 买卖股票的最佳时机 IV

    2024年02月13日
    浏览(32)
  • 【学会动态规划】买卖股票的最佳时机 III(17)

    目录 动态规划怎么学? 1. 题目解析 2. 算法原理 1. 状态表示 2. 状态转移方程 3. 初始化 4. 填表顺序 5. 返回值 3. 代码编写 写在最后: 学习一个算法没有捷径,更何况是学习动态规划, 跟我一起刷动态规划算法题,一起学会动态规划! 题目链接:123. 买卖股票的最佳时机 II

    2024年02月13日
    浏览(44)
  • DAY55:动态规划(买卖股票的最佳时机3)

    这道题比上面状态更多,是因为卖出股票后,你无法在第二天买入股票 (即冷冻期为1天)。 状态 状态一:持有股票状态(今天买入股票,或者是之前就买入了股票然后没有操作,一直持有) 不持有股票状态,这里就有两种卖出股票状态 状态二:保持卖出股票的状态(两天前

    2024年02月22日
    浏览(32)
  • 【学会动态规划】买卖股票的最佳时机含手续费(16)

    目录 动态规划怎么学? 1. 题目解析 2. 算法原理 1. 状态表示 2. 状态转移方程 3. 初始化 4. 填表顺序 5. 返回值 3. 代码编写 写在最后: 学习一个算法没有捷径,更何况是学习动态规划, 跟我一起刷动态规划算法题,一起学会动态规划! 这道题也不难理解,主要有两个点需要注

    2024年02月14日
    浏览(30)
  • 【LeetCode股票买卖系列:309. 最佳买卖股票时机含冷冻期 | 暴力递归=>记忆化搜索=>动态规划】

    🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,CSDN-Java领域新星创作者🏆,保研|国家奖学金|高中学习JAVA|大学完善JAVA开发技术栈|面试刷题|面经八股文

    2024年02月02日
    浏览(35)
  • 动态规划 Leetcode 714 买卖股票的最佳时机含手续费

    Leetcode 714 学习记录自代码随想录 要点:1.两种状态持有股票和不持有股票; 2.递推公式 d p [ i ] [ 0 ] = m a x ( d p [ i − 1 ] [ 0 ] , d p [ i − 1 ] [ 1 ] − p r i c e s [ i ] ) d p [ i ] [ 1 ] = m a x ( d p [ i − 1 ] [ 1 ] , d p [ i − 1 ] [ 0 ] + p r i c e s [ i ] − f e e ) dp[i][0] = max(dp[i-1][0], dp[i-1][1]-prices

    2024年04月09日
    浏览(32)
  • 309. 买卖股票的最佳时机含冷冻期(leetcode) 动态规划思想

    在本文章中,我们将要详细介绍一下Leetcode中买卖股票的最佳时机含冷冻期相关的内容,本题采用动态规划的思想解决 列出dp表,dp表中值的含义是什么    dp[i]表示第i天之后此时的最大利润 由于第i天不确定具体状态,多状态dp问题     🌟 .dp[i][0]:手中有股票没有卖出,我

    2024年02月03日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包