【力扣每日一题】2023.10.8 股票价格波动

目录

题目:

示例:

分析:

代码:


题目:

【力扣每日一题】2023.10.8 股票价格波动_第1张图片

示例:

【力扣每日一题】2023.10.8 股票价格波动_第2张图片

分析:

这道题是程序设计题,要我们实现一个类,一共是四个功能,第一个是给一个时间戳和价格,表示该时间的股票价格,我们需要记录下这个时间以及对应的价格,如果之前已经记录过这个时间戳了,那么我们需要更新。

第二个功能是获取最新的股票价格,也就是时间戳最大时的价格。

剩下的是获取股票的最大和最小的价格。

首先我们要获取股票的最大和最小价格,那么意味着我们需要对价格排序,我们要获取时间戳最大的数据,那么我们要对时间戳排序。既然都要排序,那么我们就无法在一个容器中同时实现,可以自动排序的容器有set和map,我们应该如何选择呢?

对时间戳排序的容器我们使用map,因为时间戳一对一一个股票价格,刚好符合map的键值对,我们直接取出map最后一个元素的值就是最新的股票价格了。

对股票价格排序的容器我们使用set,这样我们需要最大价格和最小价格时只需要出去set的最后一个元素和第一个元素即可。另外要注意的是,我们不能使用set,我们需要使用multiset,因为不同时间的股票价格是可能会重复的,而multiset可以多次存放相同的元素。

三个获取的函数我们就搞定了,接下来是更新数据的函数。

如果这个时间戳我们之前没有记录,那么我们正常存入map和set即可。如果这个时间我们之前记录了,由于我们要修改股票的价格,那么我们需要先把set中对应时间戳的股票价格给删除掉,再插入新的价格即可。

代码:

class StockPrice {
public:
    mapm;      //存放时间与价格的对应关系
    multisets;     //存放记录中股票的价格
    StockPrice() {

    }
    
    void update(int timestamp, int price) {
        //如果对应时间已经有了,那么需要更新股票价格,把记录中的原价格删除
        if(m.find(timestamp)!=m.end()){     
            s.erase(s.find(m[timestamp]));
        }
        //更新对应时间的股票价格以及存放记录中股票的价格
        m[timestamp]=price;
        s.insert(price);
    }
    
    int current() {
        //map底层自动排序,直接返回map中最后一个元素的second
        return (*(m.rbegin())).second;
    }
    
    int maximum() {
        //set底层自动排序,直接返回set中最后一个元素
        return (*(s.rbegin()));
    }
    
    int minimum() {
        //set底层自动排序,直接返回set中第一个元素
        return (*(s.begin()));
    }
};

你可能感兴趣的:(力扣每日一题,leetcode,算法,c++,数据结构)