牛客网: 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