【每日一题Day341】LC2034股票价格波动 | 堆+哈希表

简介: 【每日一题Day341】LC2034股票价格波动 | 堆+哈希表

股票价格波动【LC2034】

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

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

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

更新 股票在某一时间戳的股票价格,如果有之前同一时间戳的价格,这一操作将 更正 之前的错误价格。

找到当前记录里 最新股票价格 。最新股票价格 定义为时间戳最晚的股票价格。

找到当前记录里股票的 最高价格 。

找到当前记录里股票的 最低价格 。

请你实现 StockPrice 类:

StockPrice() 初始化对象,当前无股票价格记录。

void update(int timestamp, int price) 在时间点 timestamp 更新股票价格为 price 。

int current() 返回股票 最新价格 。

int maximum() 返回股票 最高价格 。

int minimum() 返回股票 最低价格 。

放假回家 电脑坏了 国庆休息的好舒服 继续打卡

思路

使用哈希表存储每个时间点对应的价格,并使用小顶堆和大顶堆记录二元组[ 时间,价格 ] [时间,价格][时间,价格],以价格进行排序,同时记录最大时间点maxTime

update:将数据记录在哈希表、小顶堆、大顶堆,并判断是否需要更新最大时间点maxTime

current:从哈希表中获得maxTime对应的价格

maximum/minimum:如果一个时间点的价格与哈希表中不一致,那么不是有效数据,将大顶堆/小顶堆中的无效数据移除后,返回堆顶元素

实现

class StockPrice {
    // 如果发生了价格更正,那么会影响最高价格和最低价格
    // 使用小顶堆、大顶堆存放二元组[时间,价格],哈希表记录每个时间对应的最新价格 堆顶元素时间对应的价格必须与哈希表一致
    // 记录最大时间
    PriorityQueue<int[]> mxPq;
    PriorityQueue<int[]> mnPq;
    int mxTime;
    Map<Integer,Integer> map;
    public StockPrice() {
        this.mxPq = new PriorityQueue<>((o1, o2) -> o2[1] - o1[1]);
        this.mnPq = new PriorityQueue<>((o1, o2) -> o1[1] - o2[1]);
        mxTime = -1;
        map = new HashMap<>();
    }
    public void update(int timestamp, int price) {
        map.put(timestamp, price);
        mxTime = Math.max(mxTime, timestamp);
        mxPq.add(new int[]{timestamp, price});
        mnPq.add(new int[]{timestamp, price});
    }
    public int current() {
        return map.get(mxTime);
    }
    public int maximum() {
        // 懒删除
        while (mxPq.peek()[1] != map.get(mxPq.peek()[0])){
            mxPq.poll();
        }
        return mxPq.peek()[1];
    }
    public int minimum() {
        // 懒删除
        while (mnPq.peek()[1] != map.get(mnPq.peek()[0])){
            mnPq.poll();
        }
        return mnPq.peek()[1];
    }
}
/**
 * Your StockPrice object will be instantiated and called as such:
 * StockPrice obj = new StockPrice();
 * obj.update(timestamp,price);
 * int param_2 = obj.current();
 * int param_3 = obj.maximum();
 * int param_4 = obj.minimum();
 */


目录
相关文章
|
安全 算法 量子技术
密码学系列之十:量子密码
密码学系列之十:量子密码
|
开发框架 算法 前端开发
一位.Net开发工程师的客户端技术栈的学习路线
从2018年硕士毕业后,我一直从事着.Net开发工作,趁着CSDN这次活动,给大家分享一下.Net客户端领域的技术栈的学习路线,这个学习路线,涵盖的是比较基础的内容,适合刚入门.Net的萌新学习和刚进入职场的毕业生查漏补缺,然后这个博文比较受大家的欢迎的话,后续可能会考虑出一个更详细的版本。致敬我彻夜学习的.Net。
一位.Net开发工程师的客户端技术栈的学习路线
|
Java 关系型数据库 MySQL
"解锁Java Web传奇之旅:从JDK1.8到Tomcat,再到MariaDB,一场跨越数据库的冒险安装盛宴,挑战你的技术极限!"
【8月更文挑战第19天】在Linux上搭建Java Web应用环境,需安装JDK 1.8、Tomcat及MariaDB。本指南详述了使用apt-get安装OpenJDK 1.8的方法,并验证其版本。接着下载与解压Tomcat至`/usr/local/`目录,并启动服务。最后,通过apt-get安装MariaDB,设置基本安全配置。完成这些步骤后,即可验证各组件的状态,为部署Java Web应用打下基础。
213 1
|
缓存 Ubuntu 网络协议
Linux中常见的问题
【10月更文挑战第2天】
212 3
|
数据处理 开发者 C++
Kotlin协程与RxJava:谁将称雄现代应用开发?揭秘背后的技术博弈与选择之道!
【9月更文挑战第13天】本文对比了现代应用开发中备受欢迎的两种并发编程方案:Kotlin协程与RxJava。Kotlin协程以轻量级线程和挂起函数简化异步编程,尤其适合I/O密集型任务;RxJava基于观察者模式,擅长处理复杂异步数据流。文中还提供了示例代码,帮助开发者根据项目需求和偏好做出合适的选择。
248 1
|
机器学习/深度学习 算法 测试技术
PYTHON用LSTM长短期记忆神经网络的参数优化方法预测时间序列洗发水销售数据
PYTHON用LSTM长短期记忆神经网络的参数优化方法预测时间序列洗发水销售数据
|
JavaScript 前端开发 内存技术
Vue入门:构建你的第一个Vue应用程序
【4月更文挑战第22天】Vue.js 入门教程:安装 Node.js 和 npm,使用 Vue CLI (`npm install -g @vue/cli`) 创建项目,选择预设或自定义配置。在 `src/components/` 创建 `HelloWorld.vue` 组件,显示数据属性。在 `App.vue` 中引入并注册组件,启动开发服务器 (`npm run serve`) 预览。开始你的 Vue 之旅!
283 2
|
数据采集
【大模型】大语言模型训练数据中的偏差概念及其可能的影响?
【5月更文挑战第5天】【大模型】大语言模型训练数据中的偏差概念及其可能的影响?
|
C++
【SPSS】二项分布检验详细操作教程(附案例实战)
【SPSS】二项分布检验详细操作教程(附案例实战)
1035 0
|
存储 运维 NoSQL
深入理解Redis集群模式、协议、元数据维护方式
深入理解Redis集群模式、协议、元数据维护方式
602 0