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

下面是详细讲解“C++实现LeetCode(122.买股票的最佳时间之二)”的完整攻略。

什么是买股票的最佳时间问题

买股票的最佳时间问题是一个经典的动态规划问题,其求解目标是:给定一组股票价格,求出在给定的时间范围内,我们应该在哪些时间买入和卖出股票,才能获取最大收益。

LeetCode的买股票的最佳时间问题

针对该问题,LeetCode中的 https://leetcode.com/problems/best-time-to-buy-and-sell-stock-ii/ 给出了一道非常经典的问题:买股票的最佳时间之二。题目描述如下:

问题: 给定一个数组 prices ,其中 prices[i] 是一支给定股票第 i 天的价格。

设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。

注意: 你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

示例

输入: [7,1,5,3,6,4]

输出: 7

解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出,这笔交易所能获得利润 = 5 - 1 = 4 。随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,这笔交易所能获得利润 = 6 - 3 = 3 。

思路

根据题目,我们可以发现一下几个规律:

  1. 可以进行多次交易,即如果在第i天前能获得利润,那么第i天的股票价格当天买进、明天卖出所获得的利润是相等的;

  2. 利润可以累加,即如果第i天和第j天进行交易获得利润,那么第i天买进、第j天卖出所获得的利润等于第i天买进、第j-1天卖出所获得的利润加上第j天卖出和第j-1天买进所获得的利润。

根据这两个规律,我们可以定义动态规划转移方程如下:

$$dp[i] = dp[i-1] + (price[i] - price[i-1])\ where\ price[i] > price[i-1]$$

其中,$dp[i]$表示第i天所能获得的最大利润,$price[i]$表示第i天的股票价格。上式中的$price[i] - price[i-1]$即为股票在第i天和第i-1天的价格差,如果这个差值大于0,则说明可以在这两天之间获得利润,因此我们将这个差值加入到$dp[i-1]$中。

如果上式中的条件不满足,则说明在第i天不能获得利润,并且也不能进行交易。总的来说,如果数组中的元素个数为n,那么当天我们有两种决策:

  1. 如果$price[i] > price[i-1]$,则我们可以选择在第i-1天买入,在第i天卖出,也可以选择不进行任何操作。

  2. 如果$price[i] \leq price[i-1]$,则我们不能进行任何操作。

因此,我们只需要求出所有可以获得利润的差值并求和,就可以得到最大的利润。时间复杂度为O(n),空间复杂度为O(1)。

代码

下面是用C++实现的代码:

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int n = prices.size();
        int ans = 0;
        for (int i = 1; i < n; i++) {
            if (prices[i] > prices[i-1]) {
                ans += (prices[i] - prices[i-1]);
            }
        }
        return ans;
    }
};

示例说明

这里给出两个示例:

示例1

输入:

[7,1,5,3,6,4]

输出:

7

解释:

在第2天(股票价格 = 1)的时候买进,在第3天(股票价格 = 5)的时候卖出,可以获得4元的利润。

在第4天(股票价格 = 3)的时候买进,在第5天(股票价格 = 6)的时候卖出,可以获得3元的利润。

因此,总的最大利润为7元。

示例2

输入:

[1,2,3,4,5]

输出:

4

解释:

在第1天(股票价格 = 1)的时候买进,在第5天(股票价格 = 5)的时候卖出,可以获得4元的利润。

因此,总的最大利润为4元。

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

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

相关文章

  • C++获得其他程序窗体控件中信息的方法

    C++获得其他程序窗体控件中信息是一个比较常见的需求,例如在自动化测试、窗口助手等场景下都有可能用到。下面我们就介绍一下C++获得其他程序窗体控件中信息的方法。 安装Visual Studio 获得其他程序窗体控件中信息,在Windows下通过Win32 API是最常用的方法。而在Win32 API的基础上,可以利用Visual Studio提供的MFC等框…

    C 2023年5月30日
    00
  • C++函数指针+对象指针+this指针+指向类静态和非静态成员的指针

    C++函数指针、对象指针、this指针以及指向类静态和非静态成员的指针是C++语言中常用的指针类型。这些指针类型的使用可以让我们更加灵活地实现一些复杂的功能和设计模式。下面我们会逐一讲解它们的使用。 函数指针 函数指针是指向函数的指针类型。函数指针可以用于实现回调函数、函数指针数组等功能。函数指针的通用形式为:返回值类型(*函数指针变量名)(参数列表)。 例…

    C 2023年5月22日
    00
  • C语言实现简单的定时器

    下面是详细讲解“C语言实现简单的定时器”的完整攻略。 一、定时器基本概念 在计算机中,定时器是一种可以精确测量时间的硬件或软件设备。它可以用于各种计算机程序中,比如处理定时任务、测量延迟等等。 一般来说,定时器都会有一个计数器,当计数器达到一定值后,就会触发一个中断以执行相关处理。在实际编程中,我们需要用到定时器,往往需要先初始化定时器并设置计数器的初值和中…

    C 2023年5月22日
    00
  • C语言实现循环队列

    C语言实现循环队列的完整攻略 前言 循环队列是一种常用的数据结构,用于解决队列数据访问时线性存储空间限制的问题。本文将讲解如何使用C语言实现循环队列。 队列的定义 队列是一种特殊的线性表,具有先进先出(FIFO)的特点,即最先进入队列的元素最先被取出。 循环队列的特殊之处在于,队列空间是使用连续的线性存储空间而形成的一个环。 循环队列的实现 代码实现 在C语…

    C 2023年5月23日
    00
  • OpenCV利用高斯模糊实现简单的磨皮美颜效果

    下面是关于OpenCV利用高斯模糊实现简单的磨皮美颜效果的完整攻略。 1. 磨皮美颜效果简介 磨皮美颜是一种通过图像处理算法,以减少图像中噪点等细节进行图像平滑和减少细节信息等操作,使得图像看起来更加平滑细腻的效果。 OpenCV是一款流行的开源计算机视觉库,支持各种图像处理函数,包括高通、低通、滤波器等。我们可以利用OpenCV的高斯模糊算法来实现简单的磨…

    C 2023年5月22日
    00
  • windows10开始菜单失灵及异常的解决方法

    Windows 10开始菜单失灵及异常的解决方法 在Windows 10系统中,开始菜单是一项非常重要的功能。但是,有时候可能会出现开始菜单失灵或异常等问题,这会影响我们的使用体验。下面是解决这些问题的一些方法。 方法一:重新启动Windows Explorer 右键点击任务栏,选择“任务管理器”。 找到“Windows Explorer”进程,右键点击并选…

    C 2023年5月23日
    00
  • C++ com编程学习详解

    C++ COM编程学习详解攻略 什么是COM? COM(Component Object Model)是一种面向对象的软件组件技术,主要用于在不同的应用程序之间通信。使用COM,你可以编写可重用的软件组件,这些组件可以跨越不同的编程语言,操作系统和网络。COM最初是由Microsoft开发的。 学习COM的前提条件 了解C++语言,并熟练掌握面向对象编程。 …

    C 2023年5月22日
    00
  • Kotlin的枚举与异常示例详解

    Kotlin的枚举与异常示例详解 枚举(Enum) 枚举是指具有固定数量的、有限的、不同类型的值的集合,它们被定义在枚举类中。在Kotlin中,使用enum class关键字来声明一个枚举类。 声明枚举类型 下面是一个基本的颜色枚举类型的示例: enum class Color { RED, ORANGE, YELLOW, GREEN, BLUE, INDI…

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