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

数据流中的中位数

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
}

全部评论

相关推荐

沉淀一会:1.同学你面试评价不错,概率很大,请耐心等待; 2.你的排名比较靠前,不要担心,耐心等待; 3.问题不大,正在审批,不要着急签其他公司,等等我们! 4.预计9月中下旬,安心过节; 5.下周会有结果,请耐心等待下; 6.可能国庆节前后,一有结果我马上通知你; 7.预计10月中旬,再坚持一下; 8.正在走流程,就这两天了; 9.同学,结果我也不知道,你如果查到了也告诉我一声; 10.同学你出线不明朗,建议签其他公司保底! 11.同学你找了哪些公司,我也在找工作。
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务