LeetCode 2034. 股票价格波动

文章目录

  • 一、题目
    • 1、题目描述
    • 2、基础框架
    • 3、原题链接
  • 二、解题报告
    • 1、思路分析
    • 2、时间复杂度
    • 3、代码详解
  • 三、本题小知识
  • 四、加群须知

一、题目

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算法全集》,数据结构,算法,有序集合,平衡二叉树)