九章算法 | Google面试题:寻找中位数
九章算法揭秘:Google面试中,如何快速找到动态数组的中位数
作者:JZ | 九章算法独家分享
在数据结构的世界里,中位数这一概念看似简单,但在动态环境下却隐藏着深奥的算法策略。今天,我们将一起探讨如何设计一个数据结构,轻松应对Google面试中的挑战,实现高效查找动态数组的中位数。
问题背景:给定一个可变数组,需要支持两种操作:addNum,向数组中插入一个新元素;findMedian,返回当前数组的中位数。对于偶数个元素,中位数是中间两个数的平均值,对于奇数个元素,中位数则是中间的那个数。
思路与分析
面对动态插入和查询,我们需要找到一个平衡且高效的解决方案。静态时,我们可能会想到排序,但这在动态情况下会消耗大量时间。因此,我们需要寻找一个数据结构,它的操作时间复杂度应为O(log n)或更低。
堆和平衡二叉树是两个可能的选择,但堆由于其操作简单且在面试场景中常见,我们优先考虑。堆(如大根堆和小根堆)恰好满足中位数的特性:新元素加入后,我们需要维护两个堆,一个保证元素小于或等于中位数,另一个保证元素大于中位数。这样,中位数就是大根堆的堆顶(奇数元素)或两个堆顶的平均值(偶数元素)。
数据结构与算法设计
设计的核心是维护两个堆:P(大根堆,存储元素不大于中位数的值)和Q(小根堆,存储元素不小于中位数的值)。当addNum操作时,新元素先加入P,然后根据堆的大小关系调整堆结构,确保性质1(A中元素均小于等于B中元素)和性质2(A中的元素和B中的元素一样多或只多一个)始终成立。在findMedian查询时,中位数就是P的堆顶或者P和Q的堆顶值的平均值。
这种策略允许我们在O(log n)的时间复杂度内完成插入和查询,大大提升了效率。面试官会关注你对堆的理解和运用,以及如何根据问题特性选择合适的数据结构。
实战演练与学习资源
如果你想进一步练习,可以尝试LintCode上的相关题目,如"Sliding window median"和"Median",它们将帮助你巩固对这个算法的理解和应用。
总的来说,解决这个问题的关键在于深入理解数据结构的特性,结合实际问题灵活运用,才能在Google面试中脱颖而出。希望这个解题思路能为你的面试准备提供一些启示。
白卷小儿: 这个问题我前前后后考虑了有快一年了,也和不少人讨论过.据我得到的消息,Google和微软都面过这道题.这道题可能很多人都听说过,或者知道答案(所谓的堆),不过我想把我的答案写出来.我的分析也许存有漏洞,以交流为目的.但这...
京山县18879007765: 谷歌面试题中关于算法的问题的具体解答过程??
白卷小儿: 谷歌面试题: 平面上N个点,求一条直线,穿过的点数最多 思路:2点确定一条线,N个点共有n(n-1)/2条线,穿过的点数最多的直线,斜率相同的最多,因此只要找出相同斜率最多的点对集合,并且有公共点的即可 方法一:用上三角矩阵,矩阵...
京山县18879007765: 你拿着两个鸡蛋站在在一栋100层的大楼前.这两个鸡蛋或许很结实,就算是从100层大楼的楼顶掉下也不会摔破网上看到的,据说是Google的面试题 答案给的... - ?
白卷小儿:[答案] 第一次 在16楼 如果碎了就拿第二个蛋去1楼,然后2楼...如果不碎就去16+15 楼 如果碎了就去16+1 楼 如果不碎去16+15+14楼 如果碎了就去16+15+1 楼 如果不碎去16+15+14+13楼 如果碎了就去16+15+14+1 楼 如果不碎去16+15...
京山县18879007765: Google面试题? - ?
白卷小儿: 答案是先从14楼开始抛第一次;如果没碎,再从27楼抛第二次;如果还没碎,再从39楼抛第三次;如果还没碎,再从50楼抛第四次;如此,每次间隔的楼层少一层.这样,任何一次抛棋子碎时,都能确保最多抛14次可以找出临界楼层. 证明如...
京山县18879007765: Google 的面试流程是怎样的?有什么心得 - ?
白卷小儿: 第一阶段:电面(Phone Screen) 电面的面试官很有可能是你以后的同事或经理.如果你申请的是软件工程相关职位,电面将持续 30 到 60 分钟.回答编码相关问题时,你需要一边在与面试官共享的 Google Doc 上编写代码,一边清晰地阐述...
京山县18879007765: Google的疯狂面试题,请大家解答! - ?
白卷小儿: 1.抓住搅拌刀片.2.先找清洁公司问他们的收费标准,然后加价1%,把工程承包掉,然后1%作为自己的收益.3. ~4.存储数据的仓库,好像超市的货架一样繁杂,但是导购员总能按照单子准确找到想要的商品.5.24次6.先想办法确认自己可以...
京山县18879007765: google面试题 谁知道一定能测出那层的最低次数? - ?
白卷小儿: 如果第一个蛋破裂在最高点我们要扔x-1次并且我们必须从x层高扔第一个蛋.现在如果第一个蛋的第一次扔没有破裂,如果第一个蛋在第二次扔破了我们要扔x-2次第二个蛋.假如16是答案,我需要扔16次才能找到答案.来验证一下是否可以从...
京山县18879007765: google面试题?
白卷小儿: 给罐子编号,为1,2,3,4,5,然后在各个罐子中分别取出1,2,3,4,5个丸子称一下重量然后-(1+2+3+4+5)个丸子的重量结果就是被污染的罐子的编号
京山县18879007765: 改变未来的九大算法怎么样 - ?
白卷小儿: 改变未来的九大算法 本书精彩地介绍了搜索引擎、PageRank、公开密钥加密、纠错码、模式识别、数据压缩、数据库、数字签名等内容.一、内容介绍 Google得出的搜索结果是如何产生的?百度为何会陷入“搜索门”,又是什么机制使然?...
京山县18879007765: 微软的一道面试题 寻找丑数 http://www.gjrencai.com/show.asp?id=1092 - ?
白卷小儿: 2、3和5的数称作丑数(Ugly Number).例如6、8都是丑数,但14不是,因为它包含因子7.习惯上我们把1当做是第一个丑数.求按从小到大的顺序的第1500个丑数. 分析:这是一道在网络上广为流传的面试题,据说google曾经采用过这道题...