剑指offer(C++)-JZ63:买卖股票的最好时机(一)(算法-动态规划)

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

作者:翟天保Steven
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处

题目描述:

假设你有一个数组prices,长度为n,其中prices[i]是股票在第i天的价格,请根据这个价格数组,返回买卖股票能获得的最大收益

1.你可以买入一次股票和卖出一次股票,并非每天都可以买入或卖出一次,总共只能买入和卖出一次,且买入必须在卖出的前面的某一天

2.如果不能获取到任何利润,请返回0

3.假设买入卖出均无手续费

数据范围:0≤n≤10^5,0≤val≤10^4

要求:空间复杂度 O(1),时间复杂度 O(n)

剑指offer(C++)-JZ63:买卖股票的最好时机(一)(算法-动态规划)

示例:

输入:

[8,9,2,5,4,7,1]

返回值:

5

说明:

在第3天(股票价格 = 2)的时候买入,在第6天(股票价格 = 7)的时候卖出,最大利润 = 7-2 = 5 ,不能选择在第2天买入,第3天卖出,这样就亏损7了;同时,你也不能在买入前卖出股票。

解题思路:

本题是动态规划的经典题目。解题思路如下:

1.定义一个多行两列的数组。第一列存储,截止到第i天时股票不持股能达到的最大收益;第二列存储,截止到第i天时股票持股能保持的最大收益。

2.第一天无法卖出,因为没有持股,所以dp[0][0]自然是0,若第一天买入,则收益就是负当天的股价。

3.从第二天开始到最后一天,循环刷新截止到某一天时最大的收益情况。

4.第i天不持股的最大收益由两个情况决定:一是第i-1天不持股的最大收益,如果该值较大,说明在前面已经完成了较优的交易;二是第i-1天持股的最大收益,在第i天卖出了,进入不持股状态,此时如果卖出的金额比之前买入的金额大,那么该值为正,如果该值较小,说明虽然完成了低买高卖的操作,但是收益并不如之前的某个操作。

5.第i天持股的最大收益由两个情况决定:一是第i-1天持股的最大收益,如果该值较大,说明前面已经拿到了较便宜的筹码;二是第i天股价的负值,说明在当天进行了买入。

6.题目的结果就是数组中最后一行第一列的数值,也就是最后一天不持股能达到的最大收益。文章来源地址https://www.toymoban.com/news/detail-443575.html

测试代码:

class Solution {
public:

    int maxProfit(vector<int>& prices) {
        int size = prices.size();
        // dp为多行两列的数组
        // 第一列表示股票不持股能达到的最大收益
        // 第二列表示股票持股能保持的最大收益
        vector<vector<int>> dp(size, vector<int>(2, 0));
        // 第一天无法卖出,因为没有持股
        dp[0][0] = 0;
        // 第一天买入股票,进入持股状态,收益为减去当天股价
        dp[0][1] = -prices[0];
        // 动态规划刷新第二天至最后一天的结果
        for(int i = 1; i < size; ++i){
            // 第i天不持股的最大收益由两个情况决定:
            // 一是第i-1天不持股的最大收益,如果该值较大,说明已经完成了较优的交易
            // 二是第i-1天持股的最大收益,在第i天卖出了,进入不持股状态,
            // 此时如果卖出的金额比之前买入的金额大,那么该值为正,后续
            // 除非有更大的买卖差值,否则该值不会刷新
            dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] + prices[i]);
            // 第i天持股的最大收益由两个情况决定:
            // 一是第i-1天持股的最大收益,如果该值较大,说明前面已经拿到了较便宜的筹码
            // 二是第i天股价的负值,说明在当天进行了买入
            dp[i][1] = max(dp[i - 1][1], -prices[i]);
        }
        // 最后一天不持股能达到的最大收益就是最优结果
        return dp[size - 1][0];
    }
};

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

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

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

相关文章

  • 剑指offer(C++)-JZ46:把数字翻译成字符串(算法-动态规划)

    作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 题目描述: 有一种将字母编码成数字的方式:\\\'a\\\'-1, \\\'b-2\\\', ... , \\\'z-26\\\'。 现在给一串数字,返回有多少种可能的译码结果 数据范围:字符串长度满足 0n≤90 进阶:空间复杂度

    2024年02月07日
    浏览(46)
  • 剑指offer(C++)-JZ48:最长不含重复字符的子字符串(算法-动态规划)

    作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 题目描述: 请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。 数据范围:  s.length≤40000 s.length≤40000 示例: 输入: 返回值: 说明

    2024年02月06日
    浏览(58)
  • 算法刷题|121.买卖股票的最佳时机、122.买卖股票的最佳时机Ⅱ

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

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

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

    2024年03月15日
    浏览(96)
  • 动态规划——买卖股票的最佳时机系列题

    买卖股票有一系列题目 以下是我找出它们之间的区别: 第一题,只能买一次,从最低价入手,最高价卖出 第二题,可以买无数次,但买了之后,必须卖出之后,再来重新买入,再卖出。 第三题,只能买两次,但买了之后,必须卖出之后,再来重新买入,再卖出。 第四题,

    2024年01月17日
    浏览(50)
  • LeetCode:121.买卖股票的最佳时机——动态规划

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

    2023年04月17日
    浏览(42)
  • 动态规划——买卖股票的最佳时机系列题Ⅱ

    这一期是和上一期是连着的,包含的题目如下: 这三个题目所需要的思路是很相近的,先给出第一个的题目。 给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。 设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。 注意:你不能同时

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

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

    2024年02月02日
    浏览(46)
  • 算法训练第四十九天 | 121.买卖股票的最佳时机、122.买卖股票的最佳时机II

    题目链接:121.买卖股票的最佳时机 参考:https://programmercarl.com/0121.%E4%B9%B0%E5%8D%96%E8%82%A1%E7%A5%A8%E7%9A%84%E6%9C%80%E4%BD%B3%E6%97%B6%E6%9C%BA.html 视频讲解:https://www.bilibili.com/video/BV1Xe4y1u77q 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一

    2024年02月01日
    浏览(39)
  • 算法练习Day50|● 123.买卖股票的最佳时机III ● 188.买卖股票的最佳时机IV

    LeetCode:123.买卖股票的最佳时机III 123. 买卖股票的最佳时机 III - 力扣(LeetCode) 1.思路 将两次买入卖出转化为是否持有的状态,当天可进行两次买卖,故每天买卖有四种状态,四种状态包含了当天不买不卖的状态。 2.代码实现 3.复杂度分析 时间复杂度:O(n). 空间复杂度:O(1

    2024年02月12日
    浏览(44)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包