题解 | #数据流中的中位数#

数据流中的中位数

http://www.nowcoder.com/practice/9be0172896bd43948f8a32fb954e1be1

package main

import "container/heap"

var minArray minHeap
var maxArray maxHeap

func Insert(num int){
	//小顶堆存值更大的一半数,大顶堆存值更小的一半数,保证大顶堆的数全部比小顶堆的小
	heap.Init(&minArray)
	heap.Init(&maxArray)
	// 优先放在大顶堆;奇数的时候,大顶堆比小顶堆数据多1
	if maxArray.Len() <= minArray.Len() {
		// 需要插入的数据比小顶堆的最小值还小,可以直接插入大顶堆
		if num < minArray.Top() {
			heap.Push(&maxArray, num)
		} else {
			// 需要插入的数据比小顶堆的最小值大,先取出小顶堆的最小值插入大顶堆,再将目标数插入小顶堆
			heap.Push(&maxArray, heap.Pop(&minArray))
			heap.Push(&minArray, num)
		}
	} else {
		// 与上同理
		if num < maxArray.Top() {
			heap.Push(&minArray, heap.Pop(&maxArray))
			heap.Push(&maxArray, num)
		} else {
			heap.Push(&minArray, num)
		}
	}
	return
}

func GetMedian() float64{
	if maxArray.Len() > minArray.Len() {
		return float64(maxArray.Top())
	}
	return (float64(maxArray.Top()) + float64(minArray.Top())) / 2
}

type minHeap []int

func (h minHeap) Top() int {
	if len(h) == 0 {
		return 1 << 32-1
	}
	return h[0]
}

func (h *minHeap) Pop() interface{} {
	if len(*h) == 0 {
		return nil
	}
	ret := (*h)[len(*h)-1]
	*h = (*h)[:len(*h)-1]
	return ret
}

func (h *minHeap) Push(x interface{}) {
	*h = append(*h, x.(int))
	return
}

func (h minHeap) Len() int {
	return len(h)
}

func (h minHeap) Less(i, j int) bool {
	return h[i] < h[j]
}

func (h minHeap) Swap(i, j int) {
	h[i], h[j] = h[j], h[i]
	return
}

type maxHeap []int

func (h maxHeap) Top() int {
	if len(h) == 0 {
		return -1
	}
	return h[0]
}

func (h *maxHeap) Pop() interface{} {
	if len(*h) == 0 {
		return nil
	}
	ret := (*h)[len(*h)-1]
	*h = (*h)[:len(*h)-1]
	return ret
}

func (h *maxHeap) Push(x interface{}) {
	*h = append(*h, x.(int))
	return
}

func (h maxHeap) Len() int {
	return len(h)
}

func (h maxHeap) Less(i, j int) bool {
	return h[i] > h[j]
}

func (h maxHeap) Swap(i, j int) {
	h[i], h[j] = h[j], h[i]
	return
}

全部评论

相关推荐

06-26 10:08
门头沟学院 C++
北京Golang实习,一个月4700,吃住都不报,公司位置在海淀。请问友友怎么看呢?如果要租房的话有什么建议吗
码农索隆:租房肯定是合租了,剩下的钱,差不多够正常吃饭了,看看能不能学到东西吧
点赞 评论 收藏
分享
水墨不写bug:疑似没有上过大学
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务