2034.股票价格波动
2034.股票价格波动
题解
两种做法,第一种,heap包,具体使用看代码,维护一个大根堆和一个小根堆。第二种,用slice模拟Priority queue
代码
package main import "container/heap" type pair struct { timestamp, price int } type hp []pair func (h hp) Len() int { return len(h) } func (h hp) Less(i, j int) bool { return h[i].price < h[j].price } func (h hp) Swap(i, j int) { h[i], h[j] = h[j], h[i] } func (h *hp) Push(x interface{}) { *h = append(*h, x.(pair)) } func (h *hp) Pop() interface{} { cntHeap := *h val := cntHeap[h.Len()-1] *h = cntHeap[:h.Len()-1] return val } type StockPrice struct { mp map[int]int cur int maxHp, minHp hp } func Constructor() StockPrice { return StockPrice{ mp: map[int]int{}, cur: 0, } } func (this *StockPrice) Update(timestamp int, price int) { if timestamp > this.cur { this.cur = timestamp } this.mp[timestamp] = price heap.Push(&this.maxHp, pair{ timestamp: timestamp, price: -price, }) heap.Push(&this.minHp, pair{ timestamp: timestamp, price: price, }) } func (this *StockPrice) Current() int { return this.mp[this.cur] } func (this *StockPrice) Maximum() int { for { pri := this.maxHp[0] if pri.price == -this.mp[pri.timestamp] { return -pri.price } else { heap.Pop(&this.maxHp) } } } func (this *StockPrice) Minimum() int { for { pri := this.minHp[0] if pri.price == this.mp[pri.timestamp] { return pri.price } else { heap.Pop(&this.minHp) } } }
package main type StockPrice struct { currPrice int timeStamp int timeToPriMap map[int]int priQue []int } func Constructor() StockPrice { return StockPrice{ currPrice: 0, timeStamp: 0, timeToPriMap: make(map[int]int), priQue: make([]int, 0), } } func (this *StockPrice) Update(timestamp int, price int) { if timestamp >= this.timeStamp { this.timeStamp = timestamp this.currPrice = price } if oldPri, ok := this.timeToPriMap[timestamp]; ok { l, r := 0, len(this.priQue)-1 for l+1 < r { mid := l + (r-l)/2 if this.priQue[mid] <= oldPri { l = mid } else { r = mid } } idx := r if this.priQue[l] == oldPri { idx = l } //把旧的数据找到并删除 copy(this.priQue[idx:], this.priQue[idx+1:]) this.priQue = this.priQue[:len(this.priQue)-1] } this.timeToPriMap[timestamp] = price l, r := 0, len(this.priQue)-1 for l+1 < r { mid := l + (r-l)/2 if this.priQue[mid] <= price { l = mid } else { r = mid } } idx := 0 if len(this.priQue) != 0 { if this.priQue[l] >= price { idx = l } else if this.priQue[r] >= price { idx = r } else if this.priQue[r] < price { idx = r + 1 } } //把新的数据插入 this.priQue = append(this.priQue, 0) copy(this.priQue[idx+1:], this.priQue[idx:]) this.priQue[idx] = price } func (this *StockPrice) Current() int { return this.currPrice } func (this *StockPrice) Maximum() int { return this.priQue[len(this.priQue)-1] } func (this *StockPrice) Minimum() int { return this.priQue[0] }