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日

相关文章

  • 如何将JSON字符串数组转对象集合

    将JSON字符串数组转变成对象集合有以下三个步骤: 解析JSON字符串数组成JSON对象 遍历JSON对象,将每个JSON对象转化成目标对象 将转化好的目标对象添加到集合中 下面用JavaScript语言提供两种实现的示例: 示例 1 如下所示的JSON字符串数组: var jsonStrArray = [ ‘{"name":"…

    C 2023年5月23日
    00
  • win10运行游戏时出现程序无法正常启动0xc0000142解决方法介绍

    “win10运行游戏时出现程序无法正常启动0xc0000142解决方法介绍” 什么是0xc0000142错误 0xc0000142错误是一种常见的Windows运行时错误,通常在尝试启动游戏或应用程序时出现。它表示软件无法正常启动,这可能是因为操作系统无法正常处理该软件的启动流程,或者软件文件或库缺失。 解决方法 以下是解决0xc0000142错误的方法: …

    C 2023年5月22日
    00
  • Windows系统出现致命错误C0000034正在更新操作174的解决方法

    Windows系统出现致命错误C0000034正在更新操作174的解决方法 问题描述 在Windows系统更新期间,用户可能会遇到以下错误提示: Windows系统出现致命错误C0000034正在更新操作174 出现这种错误提示时,系统更新进程会在一段时间后终止,并回滚所有进行的更改,导致系统无法更新。 解决方法 以下是解决此问题的步骤: 步骤 1:进入WI…

    C 2023年5月30日
    00
  • C/S和B/S两种架构区别与优缺点分析

    C/S和B/S两种架构区别与优缺点分析 C/S架构 C/S架构即客户端/服务器架构,是一种常见的软件架构模式。C/S架构中,客户端负责与用户交互,服务器负责执行核心业务逻辑。C/S架构需要在客户端和服务器端分别安装软件,因此需要专业的IT技能来安装和维护。 优点 可以在本地运行一些比较复杂或计算密集的程序,提高了程序的执行效率。 远程协作能力较强,多个用户可…

    C 2023年5月22日
    00
  • python使用json序列化datetime类型实例解析

    以下是详细讲解“python使用json序列化datetime类型实例解析”的完整攻略: 什么是datetime类型 datetime是Python标准库中的一个模块,它提供了一系列处理日期和时间的函数。其中最主要的是datetime类,它定义了一种操作日期和时间的标准方法。 datetime与json相结合 在Python中,我们经常需要将数据序列化为JS…

    C 2023年5月23日
    00
  • C++中继承(inheritance)详解及其作用介绍

    C++中继承(inheritance)详解及其作用介绍 什么是继承? 继承是一种面向对象编程中的重要概念,指的是类(子类)拥有父类的属性和方法,在父类的基础上进行扩展或重写。继承关系中,父类也称为基类或超类,子类也称为派生类或衍生类。继承关系体现了面向对象编程中的一种复用机制,其中子类可以重用父类的代码,而且不需要重新写入相同的代码。 在C++中,继承关系可…

    C 2023年5月22日
    00
  • 深入理解c语言数组

    深入理解C语言数组 什么是数组 数组是一种数据结构,它是由相同类型的元素所组成的序列。 在C语言中,数组是由相同类型的元素在内存中连续存储所组成的。数组的下标是从0开始的非负整数,用于访问数组中的元素。数组的大小是在声明时指定的,一旦确定大小就不能改变。 数组的声明 C语言数组的声明格式如下: type arrayName[arraySize]; 其中,ty…

    C 2023年5月24日
    00
  • C语言指针入门学习面面观

    下面是详细讲解“C语言指针入门学习面面观”的完整攻略: 简介 在 C 语言中,指针是非常重要的概念,也是 C 语言与其他编程语言的区别之一。指针可以让程序员更加灵活地处理内存中的数据,提高程序的效率。但是对于初学者来说,理解指针并不容易。本文将为您提供指针入门的完整攻略,让您了解指针的基本概念、使用方法和实际应用,希望能够帮助您学好 C 语言。 指针的基本概…

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