LeetCode 2034. 股票价格波动

Posted 英雄哪里出来

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 2034. 股票价格波动相关的知识,希望对你有一定的参考价值。

文章目录

一、题目

1、题目描述

  给你一支股票价格的数据流。数据流中每一条记录包含一个 时间戳 和该时间点股票对应的 价格 。
  不巧的是,由于股票市场内在的波动性,股票价格记录可能不是按时间顺序到来的。某些情况下,有的记录可能是错的。如果两个有相同时间戳的记录出现在数据流中,前一条记录视为错误记录,后出现的记录 更正 前一条错误的记录。
  请你设计一个算法,实现:
  更新 股票在某一时间戳的股票价格,如果有之前同一时间戳的价格,这一操作将 更正 之前的错误价格。
  找到当前记录里 最新股票价格 。最新股票价格 定义为时间戳最晚的股票价格。
  找到当前记录里股票的 最高价格 。
  找到当前记录里股票的 最低价格 。
  请你实现 StockPrice 类:
  StockPrice() 初始化对象,当前无股票价格记录。
  void update(int timestamp, int price) 在时间点 timestamp 更新股票价格为 price 。
  int current() 返回股票 最新价格 。
  int maximum() 返回股票 最高价格 。
  int minimum() 返回股票 最低价格 。

  样例输入: ["StockPrice", "update", "update", "current", "maximum", "update", "maximum", "update", "minimum"] [[], [1, 10], [2, 5], [], [], [1, 3], [], [4, 2], []]
  样例输出: [null, null, null, 5, 10, null, 5, null, 2]

2、基础框架

  • C++ 版本给出的基础框架代码如下:
class StockPrice 
public:
    StockPrice() 

    
    
    void update(int timestamp, int price) 

    
    
    int current() 

    
    
    int maximum() 

    
    
    int minimum() 

    
;

3、原题链接

LeetCode 2034. 股票价格波动

二、解题报告

1、思路分析

   ( 1 ) (1) (1) 股票只有一只,求的是它在不同时间点的价格。
   ( 2 ) (2) (2) 维护一个映射:时间 − > -> > 价格。也就是对应哪个时间点的价格是多少time2priceHash,于是要想如何更新这个映射关系。
     ( 2.1 ) (2.1) (2.1) 如果对应时间的价格找不到,说明这是第一条记录,直接塞入哈希表。
     ( 2.2 ) (2.2) (2.2) 如果能够找到,那么需要将之前的价格去另一个容器删掉,然后继续更新哈希表。
     ( 2.3 ) (2.3) (2.3) 另一个容器需要满足更够求最小值、最大值。所以可以用 set(因为set是有序集合)。
   ( 3 ) (3) (3) 查询最值操作可以在set完成,由于相同价格会出现在不同的时间戳上,所以必须用multiset

2、时间复杂度

   每次操作都是 O ( l o g n ) O(logn) O(logn)

3、代码详解

class StockPrice 
    #define NOT_FIND -1
    unordered_map< int, int > time2priceHash;
    multiset<int> prices;
    int curTime;
public:
    StockPrice() 
        curTime = NOT_FIND;
        time2priceHash.clear();
        prices.clear();
    
    
    void update(int timestamp, int price) 
        curTime = max(curTime, timestamp);
        int prev = ( time2priceHash.find(timestamp) == time2priceHash.end() ? NOT_FIND : time2priceHash[timestamp] );
        time2priceHash[timestamp] = price;
        if(prev != NOT_FIND) 
            auto it = prices.find(prev);
            if(it != prices.end())
                prices.erase(it);
        
        prices.insert(price);
    
    
    int current() 
        return time2priceHash[curTime];
    
    
    int maximum() 
        return *prices.rbegin();
    
    
    int minimum() 
        return *prices.begin();
    
;


三、本题小知识

  我们学会了setmultiset的区别。


四、加群须知

  相信看我文章的大多数都是「 大学生 」,能上大学的都是「 精英 」,那么我们自然要「 精益求精 」,如果你还是「 大一 」,那么太好了,你拥有大把时间,当然你可以选择「 刷剧 」,然而,「 学好算法 」,三年后的你自然「 不能同日而语 」
  那么这里,我整理了「 几十个基础算法 」 的分类,点击开启:

🌌《算法入门指引》🌌

  如果链接被屏蔽,或者有权限问题,可以私聊作者解决。

  大致题集一览:













  为了让这件事情变得有趣,以及「 照顾初学者 」,目前题目只开放最简单的算法 「 枚举系列 」 (包括:线性枚举、双指针、前缀和、二分枚举、三分枚举),当有 一半成员刷完 「 枚举系列 」 的所有题以后,会开放下个章节,等这套题全部刷完,你还在群里,那么你就会成为「 夜深人静写算法 」专家团 的一员。
  不要小看这个专家团,三年之后,你将会是别人 望尘莫及 的存在。如果要加入,可以联系我,考虑到大家都是学生, 没有「 主要经济来源 」,在你成为神的路上,「 不会索取任何 」
  🔥联系作者,或者扫作者主页二维码加群,加入刷题行列吧🔥


🔥让天下没有难学的算法🔥

C语言免费动漫教程,和我一起打卡!
🌞《光天化日学C语言》🌞

让你养成九天持续刷题的习惯
🔥《九日集训》🔥

入门级C语言真题汇总
🧡《C语言入门100例》🧡

组团学习,抱团生长
🌌《算法零基础100讲》🌌

几张动图学会一种数据结构
🌳《画解数据结构》🌳

竞赛选手金典图文教程
💜《夜深人静写算法》💜

以上是关于LeetCode 2034. 股票价格波动的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 1345. 跳跃游戏 IV(双向bfs) / 1332. 删除回文子序列 / 2034. 股票价格波动

解题报告力扣 第 262 场周赛

数据结构与算法之深入解析“股票价格波动”的求解思路与算法示例

CCF——最大波动(2016-9)

CCF - 201609-1 - 最大波动

CCF CSP 201609-1 最大波动