2034.股票价格波动-LeetCode

难度:中等

目录

一、问题描述

二、解题思想

三、解题

1、判断极端情况

2、代码实现

四、总结


一、问题描述

这里直接采用的是LeetCode上面的问题描述。

        给你一支股票价格的数据流。数据流中每一条记录包含一个 时间戳 和该时间点股票对应的 价格

不巧的是,由于股票市场内在的波动性,股票价格记录可能不是按时间顺序到来的。某些情况下,有的记录可能是错的。如果两个有相同时间戳的记录出现在数据流中,前一条记录视为错误记录,后出现的记录 更正 前一条错误的记录。

请你设计一个算法,实现:

  • 更新 股票在某一时间戳的股票价格,如果有之前同一时间戳的价格,这一操作将 更正 之前的错误价格。
  • 找到当前记录里 最新股票价格 。最新股票价格 定义为时间戳最晚的股票价格。
  • 找到当前记录里股票的 最高价格 。
  • 找到当前记录里股票的 最低价格 

请你实现 StockPrice 类:

  • StockPrice() 初始化对象,当前无股票价格记录。
  • void update(int timestamp, int price) 在时间点 timestamp 更新股票价格为 price 
  • int current() 返回股票 最新价格 。
  • int maximum() 返回股票 最高价格 
  • int minimum() 返回股票 最低价格 。

下面给出示例:

2034.股票价格波动-LeetCode_第1张图片

 提示:

  • 1 <= timestamp, price <= 109
  • update,current,maximum 和 minimum 调用次数不超过 105 。
  • current,maximum  minimum 被调用时,update 操作 至少 已经被调用过 一次 。

二、解题思想

        这里刚开始想使用 vector 来存储时间戳对应的价格,但是上述例子中的 updata 中只有

"1","2","4" 没有出现时间戳 "3" 对于离散的序列, 我们需要使用 哈希表 来维护其 时间戳 与对于的价格。

        为了能实时访问到 最大最小的价格, 我们需要实时维护到 一个价格表 。有两种解决办法:

  1. 使用数组存储价格,并且实时排序。
  2. 使用有序表存储

        还有一种情况,就是 更新了价格,但是 之前的价格 也存储到了 价格表 中,我们需要将之前的价格在价格表中进行 删除

        对于需要返回最新的价格,这里是需要使用一个 CurrentTimestamp 来存储最大的时间戳,方便直接在哈希表中查找 最新的价格

三、解题

1、判断极端情况

        此题无极端情况。

2、代码实现

class StockPrice {
public:
    StockPrice() {
        this->CurrentTimestamp = 0;
    }
    
    void update(int timestamp, int price) {
        //保存最新时间戳,方便访问最新价格
        CurrentTimestamp = max(timestamp,CurrentTimestamp);
        //保存前当前时间戳的前一个价格 如果没有的话 就是 0
        // timestampPrice.count(timestamp) 统计timestamp之前出现过几次 没有的话 前一个价格为 0 
        int prePrice = timestampPrice.count(timestamp) ? timestampPrice[timestamp] : 0;
        // 保存时间戳的 最新价格
        timestampPrice[timestamp] = price;
        //维护价格表,如果当前timestamp 的前一个价格 大于 0 那么在有序价格表中删除该价格,防止错误访问
        if(prePrice > 0){
            auto item = Prices.find(prePrice);
            if(item != Prices.end()){
                Prices.erase(item);
            }
        }
        //将最新价格保存到 有序价格表中
        Prices.emplace(price);
    }
    
    int current() {
        //最新价格由最新时间戳访问
        return timestampPrice[CurrentTimestamp];
    }
    
    int maximum() {
        //Prices.rbegin()为最后一个元素的指针(迭代器),需要解引用
        return *Prices.rbegin();
    }
    
    int minimum() {
        //Prices.begin()为首元素的指针(迭代器),需要解引用
        return *Prices.begin();
    }
private:
//时间戳与对应价格匹配
unordered_map timestampPrice;
//使用有序表 维护价格
multiset Prices;
//保存最新时间戳
int CurrentTimestamp;
};

2034.股票价格波动-LeetCode_第2张图片

四、总结

        对于离散的数据,首先考虑就是使用 哈希表 来存储相应的键值对,对于需要实时返回 最大 最小 的信息的数据,我们直接使用 有序表 multiset (整型) 来维护,每次插入数据其都会自动进行排序,比较方便。

        如果对你有帮助的话,请star ♥ 一下,收藏一下,蟹蟹啦!

你可能感兴趣的:(我的leetcode题解,leetcode,算法,哈希表,c++)