算法 数据流的中位数-(大顶堆小顶堆+冒泡排序)

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

你可能感兴趣的:(牛客网,算法刷题,数据流中位数,冒泡排序,大小顶堆)