C++实现LeetCode(121.买卖股票的最佳时间)

C++实现LeetCode(121.买卖股票的最佳时间)

题目描述

给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。

如果你最多只允许完成一笔交易(即买入和卖出一支股票一次),设计一个算法来计算你所能获取的最大利润。

注意:你不能在买入股票前卖出股票。

示例 1:

输入: [7,1,5,3,6,4]
输出: 5
解释: 在第2天(股票价格 = 1)的时候买入,在第5天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。
     注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格。

示例 2:

输入: [7,6,4,3,1]
输出: 0
解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。

解法

我们可以用贪心的思路来做这道题目。我们用一个变量 minprice 来记录前 i-1 天的最低价格,用变量 maxprofit 来记录当前最大利润。我们遍历 i 天时,与 minprice 做差,可以得到当天能够获得的最大利润,然后与前面获得的利润对比,只保留更大的那一个。

具体做法如下:

  1. 初始化 minprice 为一个非常大的数,因为价格只会大于 0 。
  2. 初始化 maxprofit 为 0。
  3. 遍历数组,对于每一天的价格进行分析。
  4. 计算当天价格与之前最低价格相差的利润 profit
  5. 如果 profit 大于当前最大利润 maxprofit,则跟新 maxprofit
  6. 如果当天价格小于 minprice,则更新 minprice
  7. 最终返回 maxprofit

代码示例

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        if(prices.empty()) return 0; // 数组为空,直接返回0
        int minprice = prices[0];
        int maxprofit = 0;
        for(int i = 1; i < prices.size(); i++) {
            int profit = prices[i] - minprice; // 获取当日的最大盈利
            if(profit > maxprofit) maxprofit = profit; // 更新最大利润
            if(prices[i] < minprice) minprice = prices[i]; // 更新最低价格
        }
        return maxprofit;
    }
};

示例说明

示例 1

给定数组 [7,1,5,3,6,4],初始值为 minprice = 7maxprofit = 0

处理到第二个数 1 时,profit = 1 - minprice = -6,小于0,不做任何操作,最低价格不变,最大利润也不变。

处理到第三个数 5 时,profit = 5 - minprice,maxprofit 从0更新为5。

处理到第四个数 3 时,profit = 3 - minprice,小于 5 ,不做任何操作。

处理到第五个数 6 时,profit = 6 - minprice,比maxprofit要大,更新 maxprofit 为 6。

处理到第六个数 4 时,profit = 4 - minprice,小于 6 ,不做任何操作。

最终,返回的最大利润为 5。

示例 2

给定数组 [7,6,4,3,1],初始值为 minprice = 7maxprofit = 0

处理到第二个数 6 时,profit = 6 - minprice = -1,小于 0,不做任何操作。

处理到第三个数 4 时,profit = 4 - minprice = -3,小于0,不做任何操作。

处理到第四个数 3 时,profit = 3 - minprice = -4,小于0,不做任何操作。

处理到第五个数 1 时,profit = 1 - minprice = -6,小于0,不做任何操作。

返回的最大利润为0。

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

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

相关文章

  • 利用C#远程存取Access数据库

    利用C#远程存取Access数据库攻略 在这个攻略中,我们将会探讨如何使用C#编写程序并远程存取Access数据库。 1. 准备工作 在开始编写程序之前,我们需要下面的准备工作: 安装Access数据库或者Microsoft Office。 熟悉C#编程语言基础知识。 安装Visual Studio开发环境。 2. 创建一个.NET项目 我们首先需要打开Vi…

    C 2023年5月22日
    00
  • Python对文件和目录进行操作的方法(file对象/os/os.path/shutil 模块)

    接下来我将详细讲解Python对文件和目录进行操作的方法,包括file对象、os模块、os.path模块和shutil模块的使用方法。 一、file对象 1.1 打开文件 在Python中,我们使用open()函数来打开一个文件。open()函数的基本语法如下所示: f = open(file, mode=’r’, buffering=-1, encodin…

    C 2023年5月23日
    00
  • C++ 中回调函数详解及简单实例

    C++ 中回调函数详解及简单实例 什么是回调函数 在C++中,回调函数是一种以函数指针的形式实现的编程技巧。简而言之,回调函数就是一种通过在函数参数中传递函数指针的形式,来实现在需要时调用这个函数的一种方式。 回调函数的用途 回调函数最常见的使用场景是在异步和事件驱动编程中,当一个事件触发时,需要某个函数处理该事件。由于该事件的触发时间不确定,因此需要把该函…

    C 2023年5月30日
    00
  • Go JSON编码与解码的实现

    Go JSON编码与解码的实现 在Go语言中,JSON编码与解码非常常见,Golang标准库提供了encoding/json包来支持JSON格式数据的序列化和反序列化。接下来将详细讲解如何使用encoding/json包进行JSON编码与解码。 JSON编码 JSON编码,指将Go语言中的结构体等数据类型转换成JSON格式的字符串。在Go语言中,使用json…

    C 2023年5月23日
    00
  • 如何修改MYSQL5.7.17数据库存储文件的路径

    以下是具体的攻略,分为以下几个步骤: 1. 关闭MySQL数据库 在开始修改MySQL数据库存储文件的路径之前,需要先关闭MySQL数据库,具体操作可以参照以下命令: sudo /etc/init.d/mysql stop 2. 复制原存储文件内容 在进行路径修改之前,需要先将原来的存储文件内容复制到将要修改的路径下,具体操作可以参照以下命令: sudo c…

    C 2023年5月23日
    00
  • C语言中的const如何保证变量不被修改

    C语言中的const如何保证变量不被修改 在C语言中,const是一个关键字,它的作用是告诉编译器,该变量不会被修改。使用const修饰变量可以使代码更加清晰,防止代码中不恰当的修改导致意外的错误。 const的使用方法 const修饰变量有两种方式,分别是定义时声明和函数参数传递。 定义时声明 定义时声明是指在定义变量的同时,使用const关键字修饰变量。…

    C 2023年5月23日
    00
  • C语言和Python语言的区别

    C语言和Python语言的区别 C语言和Python语言是两种非常不同的编程语言。下面将分别从语法、性能、应用场景等方面介绍它们的区别。 语法 C语言的语法相对来说比较严谨和繁琐,需要手动管理内存、声明变量类型等,这意味着需要更多的代码行数和编程经验。而Python语言的语法则更加简单,语言自带垃圾回收机制、动态类型和强大的标准库,这使得开发人员可以更快速地…

    C 2023年5月10日
    00
  • C 作用域规则

    C 作用域规则详解 在 C 语言中,变量的作用域指的是变量可以被访问的范围。C 语言定义了几种作用域,其中包括块作用域、函数作用域、文件作用域和函数形参作用域等。本文将详细介绍 C 作用域规则以及示例说明。 1. 块作用域 块作用域是指只能在定义变量的块或函数内使用变量的作用域。块作用域中定义的变量通常称为局部变量。 1.1. 示例 1 #include &…

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