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 2023年5月22日
    00
  • c语言stack(栈)和heap(堆)的使用详解

    C语言 Stack 和 Heap 的使用详解 在C语言中,stack和heap是两种管理内存的方式。了解这两种内存分配的优缺点以及它们的使用方法可以给我们的程序设计带来很多好处。本文将详细讲解stack和heap的用法。 Stack 内存管理 Stack内存管理的定义 Stack是由编译器自动分配和管理的内存区域,其大小可在编译期确定。栈是一种先进后出(LI…

    C 2023年5月23日
    00
  • C/C++详解如何实现文件备份

    C/C++详解如何实现文件备份 概述 在开发过程中,我们经常需要备份重要数据文件以避免意外数据丢失。本文主要讲解如何使用C/C++语言实现文件备份功能,以确保数据安全。 方案一:使用C语言实现文件备份 思路概述 使用C语言实现文件备份需要打开源文件和目标文件,然后按照一定的规则将源文件的内容复制到目标文件中。 具体步骤 打开源文件 使用C语言中的fopen函…

    C 2023年5月23日
    00
  • Java编程异常简单代码示例

    下面是关于“Java编程异常简单代码示例”的完整攻略: 异常基础知识 首先,我们需要了解 Java 中的异常基础知识。异常是程序在执行期间出现的一些意外情况,例如空指针引用、数组下标越界等。为了处理这些情况,Java 引入了异常机制。在 Java 中,所有的异常都是 Throwable 类或其子类的实例。 Throwable 分为 Error 和 Excep…

    C 2023年5月23日
    00
  • C++全密码生成的实现代码

    为了实现C++全密码生成,需要了解一些基本的密码学概念以及相应算法,比如哈希函数、加密算法等。以下是一些实现C++全密码生成的步骤和示例代码。 步骤一:选择密码学算法 选择一种可靠的密码学算法非常必要。常见的算法包括DES、AES、RSA、MD5等。根据不同的应用场景选择合适的算法。 以MD5算法为例,它可以将任意长度信息压缩为一个128位长度的信息摘要。下…

    C 2023年5月24日
    00
  • C语言实现阶乘的示例详解

    C语言实现阶乘的示例详解 什么是阶乘 阶乘是一个数学术语,表示从1到该数所有自然数的乘积。通常用符号“!”表示。例如,3的阶乘为3! = 1 x 2 x 3 = 6。 示例1:使用for循环计算阶乘 下面是一个使用for循环计算阶乘的示例: #include <stdio.h> int main() { int num; int fac = 1;…

    C 2023年5月23日
    00
  • C语言实现图书管理系统(文件数据库)

    C语言实现图书管理系统(文件数据库)攻略 本攻略将介绍如何使用C语言实现基础的图书管理系统,数据存储采用文件数据库。本攻略包含以下内容: 设计数据结构 实现操作函数 完成主函数 示例1: 添加书籍 示例2: 按名称查询书籍 设计数据结构 首先,图书管理系统需要存储书籍的信息,因此需要定义一个书籍结构体,包含书籍的相关信息。 struct Book { int…

    C 2023年5月22日
    00
  • C语言使用指针的一维数组

    下面就是关于C语言使用指针的一维数组的使用攻略: 一、什么是一维数组 一维数组是一种常见的数据结构,它由相同类型的数据元素按顺序排列,并以一个变量名引用整个数组,在C语言中,数组的下标从0开始,下标的最大值为数组长度减1。 二、C语言使用指针的一维数组 在C语言中,我们可以使用指针来访问一维数组中的元素,常用的访问方式有两种:指针加下标和指针变量。 2.1 …

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