C++实现LeetCode(123.买股票的最佳时间之三)

yizhihongxing

下面我将从几个方面来详细讲解“C++实现LeetCode(123.买股票的最佳时间之三)”的完整攻略。

一、题目描述

本题的题目描述如下:

给定一个数组 prices ,其中 prices[i] 代表某股票在第 i 天的价格。
你最多可以完成两笔交易。计算你所能获取的最大利润。注意:你不能同时参与多笔交易(即,你必须在再次购买之前卖出之前的股票)。

但是,在完成一笔交易后,你可以立刻开始另一笔交易。

二、解题思路

本题可以使用动态规划的方法来解决。我们可以使用四个变量来分别表示在不同的情况下所能获得的最大利润:

  • buy1:表示第一次购买股票后所能获得的最大利润;
  • buy2:表示第二次购买股票后所能获得的最大利润;
  • sell1:表示第一次卖出股票后所能获得的最大利润;
  • sell2:表示第二次卖出股票后所能获得的最大利润。

在每一天结束后,我们都需要更新这四个变量的值。具体来说,对于任意一天,可能出现的情况有以下三种:

  • 对于 buy1,既可以继续保持不变(因为该天不需要进行任何交易),也可以在该天购买股票(此时需要扣除该天的股票价格);
  • 对于 sell1,既可以继续保持不变(因为该天不需要进行任何交易),也可以在该天卖出第一次购买的股票(获得该天股票价格的收益);
  • 对于 buy2sell2 也是类似的。

因此,在每一天结束后,我们都需要更新这四个变量的值。具体的更新方式如下所示:

  • buy1:维持不变,或者买入股票(扣除当前股票价格);
  • sell1:维持不变,或者卖出第一次买入的股票(增加当前的股票价格);
  • buy2:维持不变,或者在卖出第一次买入的股票的前提下买入股票(扣除当前股票价格减去第一次买入的股票所获得的收益);
  • sell2:维持不变,或者卖出第二次买入的股票(增加当前的股票价格减去第二次买入的股票所获得的收益)。

最终的答案即为 sell2

三、代码实现

下面是用 C++ 实现的代码,同时给出了两个需要特别说明的测试用例,方便理解算法的具体解释。

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int buy1 = -prices[0], sell1 = 0;
        int buy2 = -prices[0], sell2 = 0;
        for(int i=1;i<prices.size();i++){
            int preBuy1 = buy1;
            buy1 = max(buy1, -prices[i]);
            sell1 = max(sell1, preBuy1 + prices[i]); // 可以理解成当天卖出,收益为 preBuy1 + prices[i]
            int preBuy2 = buy2;
            buy2 = max(buy2, sell1 - prices[i]); // 第二次考虑其实是可以理解成在第一次卖出后再次买入,所以是 sell1 而不是 preBuy1
            sell2 = max(sell2, preBuy2 + prices[i]); 
        }
        return sell2;
    }
};

四、代码解释

在实现代码时,需要注意以下几点:

  • 第一个交易得到的收益是负数,所以需要使用负数的初始值,这里设置为 -prices[0]
  • 需要注意细节问题,比如第二次购买股票的时候,需要用第一次卖出股票后的收益来抵消购买所需要花费的钱。

五、测试用例

下面给出两个使用本算法的测试用例:

示例 1:

vector<int> prices{3,3,5,0,0,3,1,4};
Solution sol;
int res = sol.maxProfit(prices);
cout << res << endl;
// 此时的 res 的结果为 6

示例 2:

vector<int> prices{1,2,3,4,5};
Solution sol;
int res = sol.maxProfit(prices);
cout << res << endl;
// 此时的 res 的结果为 4

以上就是本题的详细解答,希望能对您有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++实现LeetCode(123.买股票的最佳时间之三) - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • 详解ubuntu安装opencv的正确方法

    详解Ubuntu安装OpenCV的正确方法 OpenCV是一个非常流行的开源计算机视觉库,它能够处理各种图像和视频处理任务。本文将详细介绍Ubuntu系统中安装OpenCV的正确方法。 步骤1:更新系统软件包 在安装OpenCV之前,我们需要确保系统中的软件包是最新的。为此,我们可以使用以下命令更新软件包: sudo apt update sudo apt …

    C 2023年5月22日
    00
  • 解析Linux下的时间函数:设置以及获取时间的方法

    解析Linux下的时间函数: 设置以及获取时间的方法 在Linux系统中,我们经常需要获取当前时间,或者将时间设置为指定的值。本文将介绍Linux系统下获取和设置时间的相关函数以及用法。 获取当前时间 在Linux系统下,我们可以使用time()函数获取当前“时间戳”,即从1970年1月1日0时0分0秒(UTC)起到现在的秒数。 #include <s…

    C 2023年5月23日
    00
  • C语言实现简易三子棋游戏

    C语言实现简易三子棋游戏 一、需求分析 能够绘制出游戏棋盘。 能够让玩家先手。 能够根据玩家落子的位置更新棋盘并判断胜负。 能够实现电脑自动下子并判断胜负。 运行结束后能统计结果并提供重新开始游戏的选项。 二、实现步骤 定义3 * 3的二维数组,用于表示棋盘。 实现绘制游戏棋盘的函数。 实现获取玩家输入坐标的函数。 实现判断坐标是否合法的函数。 实现在棋盘上…

    C 2023年5月23日
    00
  • 基于C++自动化编译工具的使用详解

    基于C++自动化编译工具的使用详解 什么是自动化编译工具 自动化编译工具可以帮助我们简化编译过程,减少手动操作,提高编译效率,节省时间。目前常见的一些自动化编译工具有Makefile、CMake、SCons等。 其中,Makefile是最原始、最传统的自动化编译工具,他是通过规定一系列源文件、头文件、编译参数、依赖关系等,使代码能够被快速编译成可执行文件。 …

    C 2023年5月23日
    00
  • QT实现将两个时间相加的算法[hh: mm + hh: mm]的示例代码

    下面是使用QT将两个时间相加的算法的示例代码和完整攻略: 1. 代码实现 #include <QTime> QTime addTime(const QTime &time1, const QTime &time2) { int minutes = (time1.minute() + time2.minute()) % 60; in…

    C 2023年5月22日
    00
  • C++中的函数知识点大全

    C++中的函数知识点大全 C++作为一门强大的编程语言,函数是它最基本的组成部分之一,函数的使用和编写对于学习C++语言来说是至关重要的。本文将介绍C++函数的多种用法和注意事项。 函数的定义 函数是对一系列操作的封装,它可以完成一个特定的功能,可以在程序中被调用。一个函数的定义有以下形式: 返回类型 函数名(参数列表){ // 函数体 } 其中,返回类型指…

    C 2023年5月22日
    00
  • Linux编译优化必须掌握的几个姿势总结

    下面我会详细讲解“Linux编译优化必须掌握的几个姿势总结”的完整攻略,过程中会包含两条示例说明。 Linux编译优化必须掌握的几个姿势总结 1. 选择正确的编译器 选择合适的编译器对于提升程序的性能至关重要。在编译器选择时,除了考虑编译速度,还应该考虑编译出来的程序的运行速度。常见的编译器有gcc、clang等,其中gcc是一个较为传统的编译器,并且它支持…

    C 2023年5月23日
    00
  • 详解C++中的万能头文件

    好的。首先让我解释一下什么是万能头文件。 在C++中,头文件是开发者定义新类型、函数和变量的地方。当一个程序中需要使用某些函数或变量时,我们需要包含对应的头文件。万能头文件指的是一些包含了大量库函数和其他头文件信息的头文件,如: #include <iostream> #include <stdio.h> #include <s…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部