牛客网: BM48
题目: 得到数据流的中位数
思路:
(1) 冒泡排序: 每次插入元素时,进行冒泡排序,将当前值与前一值比较,当前值较小时与前一元素交换,直至不小于前一元素时结束。
(2) 大小顶堆: 设置两个堆min为大顶堆(最大值在堆顶,元素取反即可),max为小顶堆(最小值为堆顶),所有元素先入堆min, 再从min中取最大元素入堆max,如果min数量小于max,从max中取堆顶入堆min; min元素数量多于max时,取出min堆顶元素为中位数,否则两个堆顶元素求均值。
代码:
(1) 冒泡排序思想
// go
package main
var nums = []int{}
func Insert(num int){
nums = append(nums, num)
right := len(nums) - 1
for right > 0 {
if nums[right] < nums[right-1] {
nums[right], nums[right-1] = nums[right-1], nums[right]
right--
} else {
break
}
}
}
func GetMedian() float64{
if len(nums) % 2 == 1 {
return float64(nums[len(nums)/2])
} else {
return float64(nums[len(nums)/2] + nums[len(nums)/2-1])/2
}
}
(2) 堆排序思想
// py
# -*- coding:utf-8 -*-
import heapq
class Solution:
def __init__(self) -> None:
# 小顶堆
self.max = []
# 大顶堆
self.min = []
def Insert(self, num):
# write code here
// 取反每次栈顶为实际最大值
heapq.heappush(self.min, -1 * num)
// 实际最大值入堆
heapq.heappush(self.max, -1 * self.min[0])
// 出堆
heapq.heappop(self.min)
if len(self.min) < len(self.max):
heapq.heappush(self.min, -1 * self.max[0])
heapq.heappop(self.max)
def GetMedian(self):
# write code here
if len(self.min) > len(self.max):
return -1.0 * self.min[0]
else:
return (-1 * self.min[0] + self.max[0])*1.0/2