【LeetCode: 2034. 股票价格波动 | 有序表】

|-----------|
| 🚀 算法题 🚀 |

🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀
🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨
🌲 作者简介:硕风和炜,CSDN-Java领域新星创作者🏆,保研|国家奖学金|高中学习JAVA|大学完善JAVA开发技术栈|面试刷题|面经八股文|经验分享|好用的网站工具分享💎💎💎
🌲 恭喜你发现一枚宝藏博主,赶快收入囊中吧🌻
🌲 人生如棋,我愿为卒,行动虽慢,可谁曾见我后退一步?🎯🎯

|-----------|
| 🚀 算法题 🚀 |


🍔 目录

    • [🚩 题目链接](#🚩 题目链接)
    • [⛲ 题目描述](#⛲ 题目描述)
    • [🌟 求解思路&实现代码&运行结果](#🌟 求解思路&实现代码&运行结果)
      • [⚡ 有序表](#⚡ 有序表)
        • [🥦 求解思路](#🥦 求解思路)
        • [🥦 实现代码](#🥦 实现代码)
        • [🥦 运行结果](#🥦 运行结果)
    • [💬 共勉](#💬 共勉)

🚩 题目链接

⛲ 题目描述

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

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

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

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

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

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

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

请你实现 StockPrice 类:

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

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

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

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

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

示例 1:

输入:

["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]

解释:

StockPrice stockPrice = new StockPrice();

stockPrice.update(1, 10); // 时间戳为 [1] ,对应的股票价格为 [10] 。

stockPrice.update(2, 5); // 时间戳为 [1,2] ,对应的股票价格为 [10,5] 。

stockPrice.current(); // 返回 5 ,最新时间戳为 2 ,对应价格为 5 。

stockPrice.maximum(); // 返回 10 ,最高价格的时间戳为 1 ,价格为 10 。

stockPrice.update(1, 3); // 之前时间戳为 1 的价格错误,价格更新为 3 。

// 时间戳为 [1,2] ,对应股票价格为 [3,5] 。

stockPrice.maximum(); // 返回 5 ,更正后最高价格为 5 。

stockPrice.update(4, 2); // 时间戳为 [1,2,4] ,对应价格为 [3,5,2] 。

stockPrice.minimum(); // 返回 2 ,最低价格时间戳为 4 ,价格为 2 。

提示:

1 <= timestamp, price <= 109

update,current,maximum 和 minimum 总 调用次数不超过 105 。

current,maximum 和 minimum 被调用时,update 操作 至少 已经被调用过 一次 。

🌟 求解思路&实现代码&运行结果


⚡ 有序表

🥦 求解思路
  1. 首先,这道题目让我们求解的是记录特定时间戳的股票价格、返回最新股票价格以及返回股票的最高和最低价格。我们分类讨论:
  2. 由于同一个时间戳可能出现多次,并且后面会覆盖前面的数据,而且需要我们找到最大最小最新的价格,因此可以来维护俩个有序集合来求解该题目。
  3. 唯一需要注意的是这俩个有序集合中维护的数值是什么?一个有序集合维护时间戳和对应的股票价格,另外一个维护股票价格以及出现的次数。
  4. 对于返回股票最新价格操作,我们可以直接通过有序集合中最后一个元素。
  5. 对于返回股票的最高和最低价格的操作,我们直接维护一个有序集合,使用有序表来维护股票价格,有序集合中的最大值和最小值即为当前哈希表中的股票的最高和最低价格。
  6. 具体求解的过程步骤请看下面代码。
🥦 实现代码
java 复制代码
class StockPrice {

    private TreeMap<Integer,Integer> map = new TreeMap<>();
    private TreeMap<Integer,Integer> count = new TreeMap<>();

	public void update(int timestamp, int price) {
		if (map.containsKey(timestamp)) {
			count.put(map.get(timestamp), count.get(map.get(timestamp)) - 1);
			if (count.get(map.get(timestamp)) == 0) {
				count.remove(map.get(timestamp));
			}
		}
		map.put(timestamp, price);
		count.put(price, count.getOrDefault(price, 0) + 1);
	}

	public int current() {
		return map.lastEntry().getValue();
	}

	public int maximum() {
		return count.lastKey();
	}

	public int minimum() {
		return count.firstKey();
	}
}

/**
 * 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();
 */
🥦 运行结果

💬 共勉

|----------------------------------|
| 最后,我想和大家分享一句一直激励我的座右铭,希望可以与大家共勉! |

相关推荐
qmx_0715 分钟前
HTB-Jerry(tomcat war文件、msfvenom)
java·web安全·网络安全·tomcat
为风而战23 分钟前
IIS+Ngnix+Tomcat 部署网站 用IIS实现反向代理
java·tomcat
limingade1 小时前
手机实时提取SIM卡打电话的信令和声音-新的篇章(一、可行的方案探讨)
物联网·算法·智能手机·数据分析·信息与通信
技术无疆2 小时前
快速开发与维护:探索 AndroidAnnotations
android·java·android studio·android-studio·androidx·代码注入
jiao000014 小时前
数据结构——队列
c语言·数据结构·算法
迷迭所归处5 小时前
C++ —— 关于vector
开发语言·c++·算法
架构文摘JGWZ5 小时前
Java 23 的12 个新特性!!
java·开发语言·学习
leon6255 小时前
优化算法(一)—遗传算法(Genetic Algorithm)附MATLAB程序
开发语言·算法·matlab
CV工程师小林5 小时前
【算法】BFS 系列之边权为 1 的最短路问题
数据结构·c++·算法·leetcode·宽度优先
Navigator_Z6 小时前
数据结构C //线性表(链表)ADT结构及相关函数
c语言·数据结构·算法·链表