| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293 | 
							- import (
 
- 	"container/heap"
 
- )
 
- type MedianFinder struct {
 
- 	max MaxHeap  // The left part (smaller part) of data
 
- 	min MinHeap  // The right part of data
 
- 	odd bool
 
- }
 
- /** initialize your data structure here. */
 
- func Constructor() (mf MedianFinder) {
 
- 	return
 
- }
 
- func (this *MedianFinder) AddNum(num int) {
 
- 	if this.max.length == 0 || num < this.max.Max() {
 
- 		heap.Push(&this.max, num)
 
- 		if this.max.length-this.min.length == 2 {
 
- 			heap.Push(&this.min, heap.Pop(&this.max))
 
- 		}
 
- 	} else {
 
- 		heap.Push(&this.min, num)
 
- 		if this.min.length-this.max.length == 1 {
 
- 			heap.Push(&this.max, heap.Pop(&this.min))
 
- 		}
 
- 	}
 
- 	this.odd = !this.odd
 
- }
 
- func (this *MedianFinder) FindMedian() float64 {
 
- 	if this.odd {
 
- 		return float64(this.max.Max())
 
- 	}
 
- 	return float64(this.max.Max()+this.min.Min()) / 2.0
 
- }
 
- type MaxHeap struct {
 
- 	heap   []int
 
- 	length int
 
- }
 
- func (max MaxHeap) Len() int           { return max.length }
 
- func (max MaxHeap) Less(i, j int) bool { return max.heap[i] > max.heap[j] }
 
- func (max MaxHeap) Swap(i, j int)      { max.heap[i], max.heap[j] = max.heap[j], max.heap[i] }
 
- func (max MaxHeap) Max() int {
 
- 	return max.heap[0]
 
- }
 
- func (max *MaxHeap) Push(x interface{}) {
 
- 	max.heap = append(max.heap, x.(int))
 
- 	max.length++
 
- }
 
- func (max *MaxHeap) Pop() interface{} {
 
- 	max.length--
 
- 	top := max.heap[max.length]
 
- 	max.heap = max.heap[:max.length]
 
- 	return top
 
- }
 
- type MinHeap struct {
 
- 	heap   []int
 
- 	length int
 
- }
 
- func (min MinHeap) Len() int           { return min.length }
 
- func (min MinHeap) Less(i, j int) bool { return min.heap[i] < min.heap[j] }
 
- func (min MinHeap) Swap(i, j int)      { min.heap[i], min.heap[j] = min.heap[j], min.heap[i] }
 
- func (min MinHeap) Min() int {
 
- 	return min.heap[0]
 
- }
 
- func (min *MinHeap) Push(x interface{}) {
 
- 	min.heap = append(min.heap, x.(int))
 
- 	min.length++
 
- }
 
- func (min *MinHeap) Pop() interface{} {
 
- 	min.length--
 
- 	top := min.heap[min.length]
 
- 	min.heap = min.heap[:min.length]
 
- 	return top
 
- }
 
- /**
 
-  * Your MedianFinder object will be instantiated and called as such:
 
-  * obj := Constructor();
 
-  * obj.AddNum(num);
 
-  * param_2 := obj.FindMedian();
 
-  */
 
 
  |