题解 | #数据流中的中位数#
数据流中的中位数
https://www.nowcoder.com/practice/9be0172896bd43948f8a32fb954e1be1
package main
import (
"container/heap"
)
func (h IntHeap) Len() int { return len(h) }
func (h IntHeap) Less(i, j int) bool { return h[i] < h[j] }
func (h IntHeap) Swap(i, j int) { h[i], h[j] = h[j], h[i] }
func (h *IntHeap) Push(x interface{}) {
*h = append(*h, x.(int))
}
func (h *IntHeap) Pop() interface{} {
old := *h
n := len(old)
x := old[n-1]
*h = old[0 : n-1]
return x
}
type IntHeap []int
type InvertIntHeap []int
// 使用全局变量来维护两个堆
var minHeap *IntHeap
var maxHeap *InvertIntHeap
func init() {
// 在init函数中初始化堆
minH := &IntHeap{}
maxH := &InvertIntHeap{}
heap.Init(minH)
heap.Init(maxH)
minHeap = minH
maxHeap = maxH
}
func (h InvertIntHeap) Len() int { return len(h) }
func (h InvertIntHeap) Less(i, j int) bool { return h[i] > h[j] }
func (h InvertIntHeap) Swap(i, j int) { h[i], h[j] = h[j], h[i] }
func (h *InvertIntHeap) Push(x interface{}) {
*h = append(*h, x.(int))
}
func (h *InvertIntHeap) Pop() interface{} {
old := *h
n := len(old)
x := old[n-1]
*h = old[0 : n-1]
return x
}
func Insert(num int) {
if maxHeap.Len() == 0 || num <= (*maxHeap)[0] {
heap.Push(maxHeap, num)
} else {
heap.Push(minHeap, num)
}
// Adjust the heaps to make sure their size difference is no more than 1
if maxHeap.Len() > minHeap.Len()+1 {
heap.Push(minHeap, heap.Pop(maxHeap))
} else if minHeap.Len() > maxHeap.Len()+1 {
heap.Push(maxHeap, heap.Pop(minHeap))
}
}
func GetMedian() float64 {
if maxHeap.Len() > minHeap.Len() {
return float64((*maxHeap)[0])
} else if minHeap.Len() > maxHeap.Len() {
return float64((*minHeap)[0])
}
return float64((*maxHeap)[0]+(*minHeap)[0]) / 2.0
}
360集团公司氛围 358人发布
查看22道真题和解析