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日

相关文章

  • vue中虚拟DOM与Diff算法知识精讲

    Vue中虚拟DOM与Diff算法知识精讲 一、Vue中的虚拟DOM 1.1 什么是虚拟DOM 虚拟DOM是一个JavaScript对象,用来描述真实的DOM节点。Vue中的虚拟DOM是VNode(虚拟节点)的实例,它具有以下特点:- 虚拟DOM可以很快的进行diff算法的比较,从而找到不同,不需要进行昂贵的DOM操作,从而提高性能。- 虚拟DOM可以在不重新…

    C 2023年5月23日
    00
  • C++内嵌汇编示例详解

    对于C++内嵌汇编示例的详解,可以从以下几个方面进行讲解: 1.概述:什么是内嵌汇编 内嵌汇编是指将汇编代码嵌入到C或C++程序中的技术,可以直接在C++源代码中嵌入汇编语言,通过内嵌汇编可以利用汇编语言的精细化控制实现高效的代码。 2.内嵌汇编说明 在C++中内嵌汇编可以使用asm关键字来实现,类似于以下形式: asm (assembly content)…

    C 2023年5月23日
    00
  • 使用devenv在命令行中编译项目的方法

    使用devenv在命令行中编译项目可以通过以下步骤完成: 打开命令提示符窗口(可通过Win + R打开运行对话框,输入“cmd”并按Enter键打开命令提示符窗口) 进入Visual Studio的公共工具目录。默认情况下,这个目录在%ProgramFiles(x86)%\Microsoft Visual Studio\版本号\公共7\Tools或%Prog…

    C 2023年5月23日
    00
  • 基于c语言中调试工具的用法汇总(不包含gdb)

    基于C语言中调试工具的用法汇总 在C语言程序的开发中,我们常常需要使用调试工具来对代码进行调试。本文将会汇总介绍一些常用的调试工具及其用法。 1. 什么是调试? 调试(Debugging)指在软件开发的过程中,从已有代码中逐步排除一个个错误,以达到使程序能够符合预期要求,并达到较高的可靠性与较好的性能优化的过程。调试的过程常常需要使用调试工具。 2. 常用的…

    C 2023年5月23日
    00
  • C 语言基础之C 语言三大语句注意事项

    C 语言是一门被广泛应用的编程语言,它的基础语法并不复杂,但是初学者在使用C语言时,常会遇到一些比较容易犯错的问题,特别是在使用C语言的三大语句的时候。本文将详细介绍C语言三大语句之if语句、for语句和while语句的使用规则和注意事项,并提供相应的示例说明。 一、if语句注意事项 if语句是C语言中最常用的分支结构语句,使用if语句可以让程序进行有条件的…

    C 2023年5月24日
    00
  • 华为 WS331c WiFi放大器怎么使用? 华为wifi放大器的使用方法

    华为 WS331c WiFi放大器是一款专门用于增强WiFi信号的设备。在使用它之前,我们需要对设备进行正确的设置和配置,才能确保信号增强的效果能够达到最佳状态。下面我们将会详细介绍华为 WS331c WiFi放大器的使用方法,包括设置和配置流程等。 安装华为 WS331c WiFi放大器 第一步是完成WiFi放大器的安装。首先,将WiFi放大器插入电源,等…

    C 2023年5月23日
    00
  • C语言中的时间函数clock()和time()你都了解吗

    当我们需要对程序运行时间进行控制和统计时,就需要使用C语言中的时间函数。其中,clock() 和 time() 函数都可以获取程序执行的时间信息,但它们的用途略有不同。 clock() clock() 函数返回的是程序的 CPU 时间,即程序执行消耗的总时间。 使用方法为:在程序执行前调用 clock() 函数,记录程序的开始时间,程序执行完毕后再次调用 c…

    C 2023年5月22日
    00
  • 一篇文章带你了解C语言:入门基础(2)

    “一篇文章带你了解C语言:入门基础(2)”攻略 1. 简介 “一篇文章带你了解C语言:入门基础(2)”是一篇介绍C语言基础知识的教程。本文主要介绍了C语言的运算、表达式、控制语句等相关知识。通过阅读本文,读者可以了解C语言的基本语法结构,为学习C语言打下基础。 2. 内容概述 本文主要分为以下几个部分: 数据类型 运算符 表达式 条件语句 循环语句 在每个部…

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