LintCode 81 [Data Stream Median]

原题

数字是不断进入数组的,在每次添加一个新的数进入数组的同时返回当前新数组的中位数。

持续进入数组的数的列表为:[1, 2, 3, 4, 5],则返回[1, 1, 2, 2, 3]
持续进入数组的数的列表为:[4, 5, 1, 3, 2, 6, 0],则返回 [4, 4, 4, 3, 3, 3, 3]
持续进入数组的数的列表为:[2, 20, 100],则返回[2, 2, 20]

时间复杂度为O(nlogn)

解题思路

  • Priority Queue
  • 维护一个MaxHeap和一个MinHeap
  • size(MinHeap) - 1 < size(MaxHeap) < size(MaxHeap)
  • MaxHeap可以通过MinHeap实现,每次put相反数入队
  • python中Priority Queue的使用
import Queue
q = Queue.PriorityQueue()
q.put(3)
q.put(1)
q.put(2)
a = q.get()
print a # output = 1

完整代码

import Queue

class Solution:
    """
    @param nums: A list of integers.
    @return: The median of numbers
    """
    def medianII(self, nums):
        result = []
        if not nums:
            return result
            
        median = nums[0]
        MaxHeap, MinHeap = Queue.PriorityQueue(), Queue.PriorityQueue()
        result.append(median)
        
        for i in range(1, len(nums)):
            if nums[i] > median:
                MinHeap.put(nums[i])
            else:
                MaxHeap.put(-nums[i])
                
            if MaxHeap.qsize() > MinHeap.qsize():
                MinHeap.put(median)
                median = -MaxHeap.get()
            if MaxHeap.qsize() + 1 < MinHeap.qsize():
                MaxHeap.put(-median)
                median = MinHeap.get()
            result.append(median)
            
        return result
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,080评论 19 139
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 11,228评论 6 13
  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,788评论 0 33
  • __block和__weak修饰符的区别其实是挺明显的:1.__block不管是ARC还是MRC模式下都可以使用,...
    LZM轮回阅读 3,400评论 0 6
  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,222评论 30 472