package main import ( "fmt" "sort" ) /*** 295. 数据流的中位数 中位数是有序列表中间的数。如果列表长度是偶数,中位数则是中间两个数的平均值。 例如: [2,3,4] 的中位数是 3 [2,3] 的中位数是 (2 + 3) / 2 = 2.5 设计一个支持以下两种操作的数据结构: void addNum(int num) - 从数据流中添加一个整数到数据结构中。 double findMedian() - 返回目前所有元素的中位数。 示例: addNum(1) addNum(2) findMedian() -> 1.5 addNum(3) findMedian() -> 2 进阶: 如果数据流中所有整数都在 0 到 100 范围内,你将如何优化你的算法? 如果数据流中 99% 的整数都在 0 到 100 范围内,你将如何优化你的算法? */ func main() { finder := Constructor() finder.AddNum(1) finder.AddNum(2) fmt.Println(finder.FindMedian()) finder.AddNum(3) fmt.Println(finder.FindMedian()) } type MedianFinder struct { Nums []int } /** initialize your data structure here. */ func Constructor() MedianFinder { return MedianFinder{[]int{}} } func (this *MedianFinder) AddNum(num int) { index := BinaryQuery(this.Nums, num) if index == -1 { var i []int i = append(i, num) this.Nums = append(i, this.Nums...) } else { a := append(this.Nums[:index], num) this.Nums = append(a, this.Nums[index:]...) } } func (this *MedianFinder) FindMedian() float64 { i := len(this.Nums) ii := i / 2 if i%2 == 0 { return float64(this.Nums[ii]) } return float64(this.Nums[ii]+this.Nums[ii-1]) / 2 } /** * Your MedianFinder object will be instantiated and called as such: * obj := Constructor(); * obj.AddNum(num); * param_2 := obj.FindMedian(); */ // BinaryQuery 二分查找的实现,如果查找成功返回索引;否则返回-1 func BinaryQuery(list []int, target int) int { // 定义并初始化low和high,声明mid low, high := 0, len(list)-1 // 前提必须进行排序 sort.Ints(list) for low <= high { mid := (low + high) / 2 if list[mid] == target { return mid } else if list[mid] > target { high = mid - 1 } else { low = mid + 1 } } return -1 }