2034. 股票价格波动 – 哈希表+有序集合
本文最后更新于 364 天前,其中的信息可能已经有所发展或是发生改变。

题目描述:

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

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

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

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

请你实现 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 <= 10^9
  • updatecurrentmaximumminimum 调用次数不超过 10^5
  • currentmaximumminimum 被调用时,update 操作 至少 已经被调用过 一次

解法一:哈希表+有序集合

算法思路:

定义以下几个数据结构和变量:

  • cur:表示当前的时间戳。
  • map:表示一个哈希表,用来记录时间戳和对应的价格。
  • prices:表示一个有序集合,用来记录所有的价格及其出现的次数。

对于以下几个操作:

  • update(int timestamp, int price)
    • 首先判断哈希表 map 中是否存在该 timestamp,如果存在,则判断有序集合 prices 中是否存在该 timestamp 对应的 price,如果该 price 存在且出现次数大于一次,则跟新该 price 的次数,将其出现次数减一,否则移除该 price
    • 更新哈希表 map 中对应的 timestamp 以及 price
    • 更新有序集合 pricesprice 的出现次数。
    • 更新 curmax(cur, timestamp)
  • current() :直接返回哈希表 mapcur 对应的价格。
  • maximum() :直接返回有序集合 prices 中的最大值。
  • minimum() :直接返回有序集合 prices 中的最小值。

代码实现:

class StockPrice {
    private int cur;
    private HashMap<Integer, Integer> map;
    private TreeMap<Integer, Integer> prices;

    public StockPrice() {
        cur = 0;
        map = new HashMap<Integer, Integer>();
        prices = new TreeMap<Integer, Integer>();
    }
    
    public void update(int timestamp, int price) {
        if(map.containsKey(timestamp)){
            Integer old = map.get(timestamp);
            if(prices.get(old) > 1){
                prices.put(old, prices.get(old) - 1);
            }else{
                prices.remove(old);
            }
        }

        cur = Math.max(cur, timestamp);
        map.put(timestamp, price);
        prices.put(price, prices.getOrDefault(price, 0) + 1);
    }
    
    public int current() {
        return map.get(cur);
    }
    
    public int maximum() {
        return prices.lastKey();
    }
    
    public int minimum() {
        return prices.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();
 */

复杂度分析:

时间复杂度:

  • StockPrice():O(1)
  • update(int timestamp, int price):O(log n)
  • current():O(1)
  • maximum():O(log n)
  • minimum():O(log n)

空间复杂度: O(n),n 为执行 update 的次数。

相关链接

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇