牛客网: BM48
题目: 得到数据流的中位数
思路:
(1) 冒泡排序: 每次插入元素时,进行冒泡排序,将当前值与前一值比较,当前值较小时与前一元素交换,直至不小于前一元素时结束。
(2) 大小顶堆: 设置两个堆min为大顶堆(最大值在堆顶,元素取反即可),max为小顶堆(最小值为堆顶),所有元素先入堆min, 再从min中取最大元素入堆max,如果min数量小于max,从max中取堆顶入堆min; min元素数量多于max时,取出min堆顶元素为中位数,否则两个堆顶元素求均值。
代码:
(1) 冒泡排序思想
// gopackage mainvar 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 hereif len(self.min) > len(self.max):return -1.0 * self.min[0]else:return (-1 * self.min[0] + self.max[0])*1.0/2