美文网首页算法
2034. 股票价格波动

2034. 股票价格波动

作者: 红树_ | 来源:发表于2023-10-07 18:19 被阅读0次

过错是暂时的遗憾,而错过则是永远的遗憾!不要害怕过错而错过。

前言

国庆节结束,准备重新开始出发,继续更新博客。最近在学习kotlin这门语言,顺便在LeetCode这个网站练习使用。kotlin语言还是比较新的,站在前人的肩膀上,吸收了很多其他语言的高级特性,和Java完全兼容。

题目

LC每日一题,参考2034. 股票价格波动,难度分1832。

解题思路

  • 哈希表+优先队列:设计题,考虑使用哈希表来存储键值对数据。对于最新数据可以在更新时记录最大时间戳即可;对于最值,考虑使用优先队列,因为堆里面只维护大根或小根所以需要使用两个优先队列,在更新时直接插入新的键值对(使用数组存储或Map.Entry),在取最大最小值时,可以取出根值和哈希表里面正确的值作比较,如果不相同说明是过期的数据直接出队列,继续取出下一个进行比较,若相等则直接返回。

哈希表+优先队列 解法

class StockPrice() {

    //考虑使用哈希表map和优先队列PriorityQueue实现
    val arr = mutableMapOf<Int,Int>()
    val pq1 = PriorityQueue<Array<Int>>{a,b->b[1]-a[1]} // 大根堆
    val pq2 = PriorityQueue<Array<Int>>{a,b->a[1]-b[1]} // 小根堆
    var maxTime = 0
    fun update(timestamp: Int, price: Int) {
        if(timestamp > maxTime) maxTime = timestamp
        arr[timestamp] = price
        pq1.offer(arrayOf(timestamp,price))
        pq2.offer(arrayOf(timestamp,price))
    }

    fun current(): Int  = arr[maxTime]!!

    fun maximum(): Int {
        while(true) { // pq1.size > 0
            val top = pq1.peek()!! // 拿到队首价格判断价格是否过期
            if(arr[top[0]] == top[1]) return top[1]
            pq1.poll()
        }
    }

    fun minimum(): Int {
        while(true) {
            val top = pq2.peek()!! // 拿到队首价格判断价格是否过期
            if(arr[top[0]] == top[1]) return top[1]
            pq2.poll()
        }
    }

}

/**
 * Your StockPrice object will be instantiated and called as such:
 * var obj = StockPrice()
 * obj.update(timestamp,price)
 * var param_2 = obj.current()
 * var param_3 = obj.maximum()
 * var param_4 = obj.minimum()
 */

复杂度分析

  • 时间复杂度:更新操作和最新数据都为O(1),取最值为O(logn)n为队列长度也即更新次数。
  • 空间复杂度:O(n)

2023.10.8

相关文章

网友评论

    本文标题:2034. 股票价格波动

    本文链接:https://www.haomeiwen.com/subject/exdvbdtx.html