【程序员面试金典】面试题 17.20. 连续中值

这篇具有很好参考价值的文章主要介绍了【程序员面试金典】面试题 17.20. 连续中值。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

题目描述

描述:随机产生数字并传递给一个方法。你能否完成这个方法,在每次产生新值时,寻找当前所有值的中间值(中位数)并保存。

中位数是有序列表中间的数。如果列表长度是偶数,中位数则是中间两个数的平均值。

例如,

[2,3,4] 的中位数是 3

[2,3] 的中位数是 (2 + 3) / 2 = 2.5

设计一个支持以下两种操作的数据结构:

void addNum(int num) - 从数据流中添加一个整数到数据结构中。
double findMedian() - 返回目前所有元素的中位数。
示例:

addNum(1)
addNum(2)
findMedian() -> 1.5
addNum(3) 
findMedian() -> 2

解题思路

思路:最直观的想法是,一个大根堆一个小根堆。中值指的是一个有序数组的最中间的一个数或者中间两个数的平均值,那么可以选择排序,但是排序所需要的时间复杂度太高了,所以就考虑什么方法能取到最中间的两个数呢?想象把数组分为两半部分,左半部分我们需要取到最右边的数,即可以使用一个大根堆存储,右半部分我们需要取到最左边的数,即可以使用一个小根堆存储。考虑到数组长度可能为奇数可能为偶数,所以我们默认设计当数组长度为奇数时小根堆比大根堆多存储一个数。

//默认是大根堆 大根堆是less<int>
priority_queue<int> maxpq;
//注意 小根堆是greater<int>
priority_queue<int,vector<int>,greater<int>> minpq;
MedianFinder() {
}
//假设小根堆可以比大根堆多一个
void addNum(int num) 
{
  if(minpq.empty()||num>=minpq.top())
  {
     if(maxpq.size()<minpq.size())
     {
        maxpq.push(minpq.top());
        minpq.pop();
     }
     //当两者相等时直接插入小根堆
     minpq.push(num);
  }
  //num<minpq.top()但是可能num>maxpq.top()
  else
  {
  	 //所以需要先插入再比较
     maxpq.push(num);
     if(maxpq.size()>minpq.size())  
     {
         minpq.push(maxpq.top());
         maxpq.pop();               
     }     
  }
} 
double findMedian() 
{
    return maxpq.size()==minpq.size()?(maxpq.top()+minpq.top())/2.0 :minpq.top();
}

总结:注意此处,是先插入再比较,还是先比较再插入。注意语法,less<int>是大根堆,而greater<int>是小根堆。文章来源地址https://www.toymoban.com/news/detail-514626.html

到了这里,关于【程序员面试金典】面试题 17.20. 连续中值的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【程序员面试金典】面试题 17.26. 稀疏相似度

    描述:两个(具有不同单词的)文档的交集(intersection)中元素的个数除以并集(union)中元素的个数,就是这两个文档的相似度。例如,{1, 5, 3} 和 {1, 7, 2, 3} 的相似度是 0.4,其中,交集的元素有 2 个,并集的元素有 5 个。给定一系列的长篇文档,每个文档元素各不相同,并与一个

    2024年02月12日
    浏览(19)
  • 【程序员面试金典】面试题 17.14. 最小K个数

    描述:设计一个算法,找出数组中最小的k个数。以任意顺序返回这k个数均可。 示例: 提示: 0 = len(arr) = 100000 0 = k = min(100000, len(arr)) 思路:最直观的想法是,排序。 扩展:最大堆。最小的k个数,那么就可以维持一个大小为k的最大堆,先填充k个数到最大堆中,然后再依次遍

    2024年02月11日
    浏览(34)
  • 【程序员面试金典】面试题 17.19. 消失的两个数字

    描述:给定一个数组,包含从 1 到 N 所有的整数,但其中缺了两个数字。你能在 O(N) 时间内只用 O(1) 的空间找到它们吗? 以任意顺序返回这两个数字均可。 示例 1: 示例 2: 提示: nums.length = 30000 思路:最直观的想法是,位运算。消失的两个数字和只出现一次的两个元素,本质

    2024年02月12日
    浏览(26)
  • 【程序员面试金典】面试题 17.21. 直方图的水量

    描述:给定一个直方图(也称柱状图),假设有人从上面源源不断地倒水,最后直方图能存多少水量?直方图的宽度为 1。 上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的直方图,在这种情况下,可以接 6 个单位的水(蓝色部分表示水)。 感谢 Marcos 贡献此图。 示例: 思路:最直观的想

    2024年02月11日
    浏览(25)
  • 《程序员面试金典(第6版)面试题 16.10. 生存人数(前缀和思想)

    给定 N 个人的出生年份和死亡年份,第 i 个人的出生年份为 birth[i],死亡年份为 death[i],实现一个方法以计算生存人数最多的年份。 你可以假设所有人都出生于 1900 年至 2000 年(含 1900 和 2000 )之间。如果一个人在某一年的任意时期处于生存状态,那么他应该被纳入那一年的

    2024年02月02日
    浏览(27)
  • 《程序员面试金典(第6版)》 面试题 08.11. 硬币(动态规划,组合问题,C++)

    硬币。给定数量不限的硬币,币值为25分、10分、5分和1分,编写代码计算n分有几种表示法。(结果可能会很大,你需要将结果模上1000000007) 示例1: 输入: n = 5 输出:2 解释: 有两种方式可以凑成总金额: 5=5 5=1+1+1+1+1 示例2: 输入: n = 10 输出:4 解释: 有四种方式可以凑成总金额: 1

    2023年04月08日
    浏览(29)
  • 程序员的20大Git面试问题及答案

    1.什么是Git? Git 是分布式版本控制系统(DVCS)。它可以跟踪文件的更改,并允许你恢复到任何特定版本的更改。 与 SVN 等其他版本控制系统(VCS)相比,其分布式架构具有许多优势,一个主要优点是它不依赖于中央服务器来存储项目文件的所有版本。 每个开发人员都可以“

    2024年02月04日
    浏览(36)
  • 程序员的20大RabbitMQ面试问题及答案

    1、什么是 RabbitMQ?为什么使用 RabbitMQ? RabbitMQ 是一款开源的,Erlang 编写的,基于 AMQP 协议的,消息中间件; 可以用它来:解耦、异步、削峰。 2、RabbitMQ 有什么优缺点? 优点:解耦、异步、削峰; 缺点:降低了系统的稳定性:本来系统运行好好的,现在你非要加入个消息

    2024年02月04日
    浏览(27)
  • 做一个“20倍程序员”

    以前有一个词叫“十倍程序员”,形容一个程序员效率高,一个顶十个。 现在随着ChatGPT的爆火,我觉得可以胆子大一点,改叫“二十倍程序员”。 我是一名十几年的老程序员,最近在学习ChatGPT,也是ChatGPT的重度用户,已经用上瘾了。 接下来我分享一下的日常用法,大家看

    2024年02月09日
    浏览(29)
  • ChatGPT在连续追问下对多线程和双重检查锁模式的理解--已经超越中级程序员

    一、问: 二、ChatGPT答:  在多线程情况下,可能会出现GZHttpClientResultModel model为null的情况,因为CACHE_RESULT_MODEL是一个ConcurrentHashMap对象,虽然它本身是线程安全的,但是它内部的操作不是完全线程安全的。 比如在cacheResultMode方法中,如果两个线程同时接近CACHE_RESULT_MODEL.con

    2023年04月27日
    浏览(20)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包