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

yizhihongxing

下面是详细讲解“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语言菜鸟基础教程之Hello World

    C语言菜鸟基础教程之Hello World 什么是C语言? C语言是一种通用的高级程序设计语言,它能够方便地对计算机进行底层操作,如硬件控制和内存访问等。同时由于其简洁、高效和强大的特性,C语言在操作系统、编译器、游戏开发等领域得到了广泛的应用。 Hello World实例 下面以经典的Hello World程序为例,让我们一步步地学习如何使用C语言进行编程…

    C 2023年5月23日
    00
  • C++成员函数如何当作回调函数同时传递this指针

    要将一个C++对象的成员函数作为回调函数并传递对象的this指针,需要使用函数对象和函数指针的技巧。下面分步骤介绍: 1. 定义函数对象 首先定义一个函数对象类,这个类中定义了一个成员函数指针和一个指向对象的指针。这个类将被用于封装成员函数以便传递给其他函数。 class Foo { public: typedef void (Foo::*Callback)…

    C 2023年5月23日
    00
  • 详解C++异常处理(try catch throw)完全攻略

    作为本站的作者,我非常乐意为你介绍“详解C++异常处理(try-catch-throw)完全攻略”的内容。本篇攻略将涵盖以下主题,包括异常的概念,异常处理基本原则,以及如何使用try-catch块和throw语句等。 异常的概念 在C++程序中,如果发生了意外的错误,比如说磁盘空间不足,用户输入错误的数据等,这些都不是我们程序的预期结果。这时,程序会抛出一个…

    C 2023年5月22日
    00
  • C 程序 查找最大的三个数字

    作为网站的作者,我很高兴向你展示使用C语言实现在一个数组中查找最大的三个数字的完整攻略。下面是具体的步骤: 步骤一:定义数组 首先,我们需要定义一个包含数字的数组,这个数组可以是任何大小,这里我们定义一个包含10个元素的数组,数组中的元素分别为:10, 20, 30, 40, 50, 60, 70, 80, 90, 100。 int arr[10] = {1…

    C 2023年5月9日
    00
  • C语言实现校园导游系统

    C语言实现校园导游系统攻略 1. 系统概述 本系统旨在实现校园导游功能,包括以下两个主要功能: 给出校园地图,包括景点名称、景点描述、景点图片等信息。 提供导游功能,可根据用户输入,为用户提供一条包含多个景点的导游路线,并展示每个景点的信息和图片。 本系统使用C语言实现。主要技术栈包括链表结构、图论算法、文件读写等。 2. 实现过程详解 2.1 数据存储 本…

    C 2023年5月23日
    00
  • 探究c++虚表实现代码

    探究 C++ 虚表的实现代码是一个相当深入的话题,需要对 C++ 对象模型以及函数调用机制有一定的了解。下面将介绍如何进行这样一个的探究,包括以下的几个部分: 对 C++ 对象模型的介绍 虚表的定义和用途 虚表的实现方式 通过示例说明虚表的使用和作用 对 C++ 对象模型的介绍 在了解虚表实现之前,我们需要先了解 C++ 对象模型。C++ 对象模型指的是 C…

    C 2023年5月23日
    00
  • ajax+asp无限级分类树型结构(带数据库)

    下面是“ajax+asp无限级分类树型结构(带数据库)”的完整攻略。 1. 什么是无限级分类树型结构? 无限级分类树型结构是一种将数据进行分类并组织成树状结构的方法,它可用于表示多个级别、多项类别的关系,常用于网站的栏目分类、商品分类、地区分类等场景。 2. 使用什么技术实现? 为了实现无限级分类树型结构,需要使用ajax和asp技术。其中ajax技术用于实…

    C 2023年5月23日
    00
  • 如何获取C++类成员虚函数地址的示例代码

    获取C++类成员虚函数地址可以通过以下步骤完成: 步骤1:定义一个具有多个虚函数的C++类。 class Base { public: virtual void func1() { cout << "Base::func1()" << endl; } virtual void func2() { cout <…

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