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

下面我将从几个方面来详细讲解“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日

相关文章

  • Python2.x与3​​.x版本有哪些区别

    Python2.x与3.x版本有哪些区别 Python2.x与3.x版本在语法上的区别 Python 3.x版本在语法上与Python 2.x版本相比有以下区别: 1. print语句 在Python 2.x版本中,print是语句,可以直接输出内容,语法如下: # Python 2.x print "hello world" 而在Pyt…

    C 2023年5月22日
    00
  • Java详细讲解异常Exception的处理

    Java详细讲解异常Exception的处理 什么是异常Exception 异常(Exception)指的是程序运行过程中不正常(错误)的情况,例如输入输出错误、计算错误、网络连接中断等情况。一般来说,出现异常会导致程序停止运行。 在Java中,异常被抛出后可以被程序处理,以免程序崩溃。Java中的异常分为两种类型:受检异常(Checked Exceptio…

    C 2023年5月22日
    00
  • exce表格中l怎么计算固定资产折旧计算表?

    计算固定资产折旧是每个企业都必须要做的一个重要的财务工作。在Excel表格中,我们可以通过几个步骤来计算固定资产的折旧,具体的攻略如下: 1. 准备固定资产信息 首先,我们需要准备好固定资产信息,包括固定资产的名称、购置日期、购置金额、预计使用年限、残值等信息。将这些信息填写到Excel的表格中。 2. 计算每年的折旧额 根据固定资产的预计使用年限和残值率,…

    C 2023年5月22日
    00
  • C语言中字符串的两种定义方式详解

    C语言中字符串的两种定义方式详解 什么是字符串? 字符串(string)是由一串字符(character)组成的序列,其中每个字符占据一个字节。在C语言中,字符串以null字符(\0)结尾,因此任何一个字符串都都包含了一个null字符。null字符不是可打印字符,而是一个表示字符串结尾的特殊符号。 直接定义字符串 在C语言中,我们可以直接定义一个字符串,定义…

    C 2023年5月23日
    00
  • C++ 简单的任务队列详解

    C++ 简单的任务队列详解 本文介绍了在 C++ 中实现一个简单的任务队列,用来处理异步任务。任务队列常用于多线程编程中,能够提高程序的并发性能。在本文中,我们将详细介绍任务队列的实现思路和步骤。 实现思路 任务队列是一个先进先出(FIFO)的数据结构,通常实现方式是使用队列。任务队列中存储的是待执行的任务。每当一个任务完成后,就从队列中取出下一个任务执行。…

    C 2023年5月22日
    00
  • C/C++指针介绍与使用详解

    C/C++指针介绍与使用详解 什么是指针 指针是C/C++中非常重要的概念,是一种特殊的数据类型,用于存储其他变量的地址。它可以说是C/C++中最具有挑战性的概念之一,也是入门程序员必须掌握的基础之一。 指针的本质是一个整数类型,但是它除了可以存储地址,也可以进行指针运算,这使得程序员可以使用指针来更灵活地操作内存,实现一些高级的算法和数据结构。 指针的定义…

    C 2023年5月23日
    00
  • C语言实现2048游戏代码

    C语言实现2048游戏代码攻略 一、项目背景 2048游戏是一款非常经典且受欢迎的益智类游戏,目前已经在各个平台上得到广泛的应用。实现2048游戏的过程既可以锻炼编程基础功底,还能提高逻辑思维能力。因此,本项目旨在利用C语言实现2048游戏代码,供初学者参考与学习。 二、实现步骤 1. 初始化棋盘 首先,我们需要在C语言中创建一个数组,并将所有元素初始化为0…

    C 2023年5月23日
    00
  • OpenCV图像轮廓提取的实现

    OpenCV图像轮廓提取的实现 图像轮廓是一组表示图像形状的点的连续曲线。在图像处理中,轮廓提取是非常重要的步骤,可以用来识别图像中的目标物体,检测边缘和形状等。OpenCV是一种流行的图像处理库,它提供了功能强大的图像轮廓提取功能。以下是OpenCV图像轮廓提取的完整攻略。 步骤1:读取图像 首先,你需要导入OpenCV和numpy库,并使用imread函…

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