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讲》🌌

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

竞赛选手金典图文教程
💜《夜深人静写算法》💜
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

英雄哪里出来

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值