首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【面试高频题】难度 3.55,可进阶经典面试题(附进阶两问答案)

题目描述 这是 LeetCode 上的「295. 数据流的中位数」,难度为「困难」。 Tag : 「优先队列(堆)」 中位数是有序列表中间的数。如果列表长度是偶数,中位数则是中间两个数的平均值。...如果数据流中 99% 的整数都在 到 范围内,你将如何优化你的算法? 优先队列(堆) 这是一道经典的数据结构运用题。...具体的,我们可以使用两个优先队列(堆)来维护整个数据流数据,令维护数据流左半边数据的优先队列(堆)为 l,维护数据流右半边数据的优先队列(堆)为 r。...; 当数据流元素数量为奇数:l 比 r 多一,此时动态中位数为 l 的堆顶原数。...如果数据流中 99% 的整数都在 到 范围内,你将如何优化你的算法?

50320
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    14种模式搞定面试算法编程题(PART II)

    该模式的工作原理是将前半部分的数字存储在Max Heap中,这是因为我们希望在上半部分找到最大的数字。然后将数字的后半部分存储在Min Heap中,因为我们希望在后半部分找到最小的数字。...应用场景 优先队列,调度等情况 找到集合中的最小/最大/中值元素 有时,在以二叉树数据结构为特征的问题中很有用 举个栗子 数据流的中位数(LEETCODE)[6] 滑动窗口的最大值(剑指offer)[7...大致思路是这样的: 根据问题将'K'元素插入到最小堆或最大堆中; 迭代剩余的数字,如果找到一个比堆中的数字大的数字,则删除该数字并插入较大的数字 ?...所有入度为“0”的节点被认为是source,并存入队列中 排序 将其添加到已排序列表中 从图中获取它的所有子结点 将每个子节点的入度减一 如果某个子节点的入度为“0”,则将其加入队列中 对于每一个source...reverse-linked-list/ [5] 反转链表II(LEETCODE): https://leetcode-cn.com/problems/reverse-linked-list-ii/ [6] 数据流的中位数

    89520

    学会这14种模式,你可以轻松回答任何编码面试问题

    该模式如下所示: 给定两个间隔(" a"和" b"),这两个间隔可以通过六种不同的方式相互关联: 了解和认识这六个情况将帮助你解决从插入间隔到优化间隔合并的各种问题。...在任何时候,都可以从两个堆的顶部元素计算当前数字列表的中位数。...识别两个堆模式的方法: 在诸如"优先级队列","计划"之类的情况下很有用 如果问题表明您需要找到集合中最小/最大/中值的元素 有时,对于解决具有二叉树数据结构的问题很有用 问题特点 查找数字流的中位数(...该模式如下所示: 给定一组[1、5、3] 从一个空集开始:[[]] 将第一个数字(1)添加到所有现有子集以创建新的子集:[[],[1]]; 将第二个数字(5)添加到所有现有子集:[[],[1],[5],...— iii)将每个孩子的度数减1。 — iv)如果一个孩子的度数变为" 0",则将其添加到源队列中。 b)重复(a),直到源队列为空。

    2.9K41

    数据流的中位数

    void addNum(int num) 将数据流中的整数 num 添加到数据结构中。 double findMedian() 返回到目前为止所有元素的中位数。...当累计添加的数的数量为奇数时, 中的数的数量比 多一个,此时中位数为 的队头。当累计添加的数的数量为偶数时,两个优先队列中的数的数量相同,此时中位数为它们的队头的平均值。...当我们尝试添加一个数 到数据结构中,我们需要分情况讨论: 此时 小于等于中位数,我们需要将该数添加到 中。新的中位数将小于等于原来的中位数,因此我们可能需要将 中最大的数移动到 中。...此时 大于中位数,我们需要将该数添加到 中。新的中位数将大于等于原来的中位数,因此我们可能需要将 中最小的数移动到 中。 特别地,当累计添加的数的数量为 时,我们将 添加到 中。...空间复杂度: ,主要为优先队列的开销。

    12110

    啊这,一道找中位数的算法题把东哥整不会了…

    学算法认准 labuladong 东哥带你手把手撕力扣 读完本文,你可以去力扣拿下第 295 题「数据流的中位数」,难度 Hard。...本文说的中位数算法比较困难,也比较精妙,是力扣第 295 题,要求你在数据流中计算中位数: 就是让你设计这样一个类: class MedianFinder { // 添加一个数字 public...void addNum(int num) {} // 计算当前添加的所有数字的中位数 public double findMedian() {} } 其实,所有关于「流」的算法都比较难...尝试分析 一个直接的解法可以用一个数组记录所有addNum添加进来的数字,通过插入排序的逻辑保证数组中的元素有序,当调用findMedian方法时,可以通过数组索引直接计算中位数。...第一,TreeSet是一种Set,其中不存在重复元素的元素,但是我们的数据流可能输入重复数据的,而且计算中位数也是需要算上重复元素的。

    1.1K10

    刷题日常(数据流中的中位数,逆波兰表达式求值,最长连续序列,字母异位词分组)

    描述 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。...我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。...题目意思就是当遍历到第一个数5的时候 因为此时为一个数为奇数 所有返回中间的一个 遍历到2时候 此时遍历了2个数字 因为是偶数 排序 返回俩个数的中位数 遍历3时候 此时遍历了3 个数字 因为是奇数...那我们只要每次维护最小的一半元素和最大的一半元素,并能快速得到它们的最大值和最小值,那不就可以了嘛。这时候就可以想到了堆排序的优先队列。...如果为偶数 设置相同数量的大小根堆 返回的时候取平均在大小根堆的堆顶元素 每次输入的数据流先进入大顶堆min排序,然后将大顶堆的堆顶弹入小顶堆max中,完成整个的排序 但是因为大顶堆min

    4300

    剑指offer【40~49】

    find(k, 0, len(tinput) - 1) return sorted(tinput[:k]) # 前 k 个数排序后再输出,不然报错 ---- 41.1 数据流中的中位数...使用堆,左边维护一个大根堆,其根存储小于中位数的最大的数,右边维护一个小根堆,其根存储大于等于中位数的最小的数。...如果 size 为偶数,则两个堆的根的平均值就是中位数;size 为奇数,右边的小根堆的根就是中位数(因为右边的堆比左边的堆的数目多 1)。...使用队列,同时使用一个一维数组记录每个字符出现的次数。...最长不含重复字符的子字符串 方法1:使用队列,记录不重复的连续子串。碰到一个字符在队列中出现过,更新最大长度,并从队列头部进行删除操作,直到碰到该字符(实际上可以理解为滑动窗口)。

    46530

    数据流的中位数(大小堆)

    例如, [2,3,4] 的中位数是 3 [2,3] 的中位数是 (2 + 3) / 2 = 2.5 设计一个支持以下两种操作的数据结构: void addNum(int num) - 从数据流中添加一个整数到数据结构中...,你将如何优化你的算法?...如果数据流中 99% 的整数都在 0 到 100 范围内,你将如何优化你的算法?...数据流中的中位数 链接 2. 大小堆解题 参考我的博客 数据结构 堆(优先队列) 类似题目: LeetCode 480. 滑动窗口中位数(大小堆升级版+set实现) LeetCode 703....数据流中的第K大元素(优先队列) 建立大顶堆(存放数据中较小的部分),小顶堆(存放较大的部分) 同时维护两个堆的大小相等或者大顶堆多一个 那么两个堆的堆顶就是中间的数据,根据奇偶,输出堆顶 class

    58810

    14种模式搞定面试算法编程题(PART I)

    14种解决面试算法编程题的思路(来自educative[1]),经过本人之前笔试面试经验证明确实确实非常非常高频,一定要十分熟悉。...问题输入是线性数据结构,如链表、数组或字符串 题目要求查找最长/最短的子字符串、子数组或所需的值 举个栗子 来看看实际应用滑动窗口解决的问题 滑动窗口的最大值(剑指offer)[2] 滑动窗口中位数(LEETCODE...使用这种方法可以有效地解决涉及以逐级顺序遍历树的任何问题。Tree BFS模式的基本思想是将根节点push到队列然后不断迭代直到队列为空。对于每次迭代,删除队列头部的节点并“访问”该节点。...从队列中删除每个节点后,我们还将其所有子节点push进队列。 ?...例如给定一个数组 [1, 5, 3] 首先初始化一个空数组:[[ ]] 将第一个数字(1)添加到所有现有子集,以创建新的子集: [[], [1]] 继续添加[[], [1], [5], [1, 5]]

    2.1K11

    BBR如何让Spotify流媒体更流畅?

    本文来自数字音乐服务商Spotify的科技博客,文章阐述了通过BBR为用户提供了更大的下载带宽,BBR是由Google开发的TCP拥塞控制算法,它旨在加快互联网数据传输速度。...我们将每个编码的音乐曲目存储为文件,复制到世界各地的HTTP服务器上。当用户播放歌曲时,Spotify应用程序将从附近具有HTTP GET范围请求的服务器以块的形式获取文件。...较慢的下载队列的带宽增加了10-15%,中位数的带宽增加了5-7%。两组之间的延迟没有差异。...地理区域的差异显着 我们看到了亚太地区和拉丁美洲情况的大部分改善,stutter次数分别减少了17%和12%。较慢的下载队列的带宽增加15-25%,中位数增加约10%。...与其他CDN相比,非BBR组并没有显示出任何明显的性能下降。当然,我们将持续密切关注这一点。 到目前为止,我们对BBR的表现非常满意。

    64640

    数据流中的中位数,确实轻敌了

    今天在刷题时候,遇到一个hard问题,也是挺有意思,在剑指offer的第41题和力扣【数据流中的中位数】。 题目描述是这样的: 中位数是有序列表中间的数。...了解完这些基本解决这题就够了,这里不需要知道堆、优先队列的具体实现。但是堆和优先队列,怎么应用到这个中位数查找呢?...但是文初提到的场景问题还是要仔细思考一下,面试场景很可能会问到: 1.如果数据流中所有整数都在 0 到 100 范围内,你将如何优化你的算法?...2.如果数据流中 99% 的整数都在 0 到 100 范围内,你将如何优化你的算法? 对于第一个问题,应该用什么方法优化呢?...然后你找到中位数,只需要枚举叠加找到中间位置的数啦。 不过你可以再进行优化,将这个计数排序修改一下,用数组值表示小于当前位置值的个数。这样这个数组值是连续递增的,查找的时候还可以使用二分优化。 ?

    62260

    系统架构设计(3)-可扩展性

    负载可以用称为负载参数的若干数字来描述。...因此,最好不要将响应时间视一个固定的数字,而是可度量的一种数值分布。 大多数请求的确快,但偶有异常,需要更长时间。这些异常请求有的确实代价高,如数据大很多。...中位数指标适合描述多少用户需等待多长时间: 一半用户请求的服务时间少于中位数响应时间,另一半则多于中位数的时间。因此中位数也称为50百分位数,缩写为p50 。...若客户端在发送请求之前总是等待先前请求的完成,就会在测试中人为缩短服务器端的累计队列深度,带来测试偏差。...即使只有很小百分比的请求缓慢,若某用户总是频 产生这种调用 ,最终总休变慢的概率就会增加(即长尾效应)。 最好将响应时间百分位数添加到服务系统监控 ,持续跟踪该指标。

    99020

    统计学入门小知识

    基本概念 mean 平均值 一组数字相加除以数字个数 , expected values 期望值 常用字母u表示,统计学里常用mean表示u median 中值 将数字从小到大排列 位于队列最中间的那个值...mode 众值 一组数字中出现频次最高的那个数字,如果出现频次最高的数字有多个,则为多众值。...weighted mean 加权平均值 给一组数中每个数规定一个权重,将每个数字和自己的权重相乘在相加起来除以总权重的到的值 例如 最终考试成绩的算法,给力如下权重 ?...我们将一组数字从小到大排列,从最小数的到中位数之间的一段数字中再取中位数叫Q1,中位数就是Q2,从中位数到最大的数中间这段的中位数叫Q3....计算Q1和Q3时我们将排序的数列一分为二,如果这组数列个数是奇数,则计算时不含中间这个中值(Q2),如果这组数列是偶数,则刚好平分 分别计算Q1和Q3 interquartile rang 四分位距(IQR

    2.4K20

    最小的k个数

    该题分类:优化时间和空间效率 解题思路 初始思路:直接排序 O(nlogn) 直接对数组排序,排序后前k个数就是答案,排序一般较快的是O(nlogn),显然这并不是时间复杂度最优解。...如果它的下标小于k,那么中位数应该位于它的右边,我们可以接着在它的右边部分的数组中查找。 这是一个典型的递归过程 详细细节见代码注释。...构造一个最大堆,最大堆的性质就是堆顶是所有堆中数字的最大值,那么放入k个数字,随后将数字中k个数字之后的数字依次和堆中的最大数字比较(也就是和堆顶数字比较),如果小于他,就把堆顶数字弹出,放入小的数字,...最大堆的性质由Java中的优先队列,通过自然数的逆序顺序进行维护,也就是下面这句构造: Queue queue = new PriorityQueue(k, Collections.reverseOrder...()); for (int i = 0; i < input.length; i++) { // 最大堆内数字个数少于k,一直添加到k个

    39230

    最小的k个数

    本体分类:优化时间和空间效率 解题思路 初始思路:直接排序 O(nlogn) 直接对数组排序,排序后前k个数就是答案,排序一般较快的是O(nlogn),显然这并不是时间复杂度最优解。...如果它的下标小于k,那么中位数应该位于它的右边,我们可以接着在它的右边部分的数组中查找。 这是一个典型的递归过程 详细细节见代码注释。...构造一个最大堆,最大堆的性质就是堆顶是所有堆中数字的最大值,那么放入k个数字,随后将数字中k个数字之后的数字依次和堆中的最大数字比较(也就是和堆顶数字比较),如果小于他,就把堆顶数字弹出,放入小的数字,...最大堆的性质由Java中的优先队列,通过自然数的逆序顺序进行维护,也就是下面这句构造: Queue queue = new PriorityQueue(k, Collections.reverseOrder...()); for (int i = 0; i < input.length; i++) { // 最大堆内数字个数少于k,一直添加到k个

    96820

    剑指Offer(六十三)-- 数据流中的中位数

    Damaer/CodeSolution 笔记地址:https://damaer.github.io/CodeSolution/ 仓库介绍:刷题仓库:CodeSolution 题目描述 如何得到一个数据流中的中位数...如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。...我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。...思路以及解答 用一个数字来不断统计数据流中的个数,并且创建一个最大堆,一个最小堆,如果插入的数字的个数是奇数的时候,让最小堆里面的元素个数比最大堆的个数多1,这样一来中位数就是小顶堆的堆顶,如果插入的数字的个数是偶数的时候...,两个堆的元素保持一样多,中位数就是两个堆的堆顶的元素相加除以2。

    22520

    教程|你不知道的监控项预处理流程逻辑

    所有来自不同数据收集器的值(无论是否经过预处理)都会在添加到历史缓存之前通过预处理管理器。基于套接字的 IPC 通信作用于数据收集器(轮询器、捕获器等)和预处理进程之间。...来自预处理管理器的本地数据缓存的历史数据正在刷新到历史缓存中。 此时数据流停止,直到历史缓存的下一次同步(当历史同步器进程执行数据同步时)。...Zabbix 内部监控项总是放在预处理队列的开头,而其他监控项类型在最后排队。 此时数据流停止,直到至少有一个未占用(即不执行任何任务)预处理进程。 当预处理进程可用时,将向它发送预处理任务。...预处理管理器将结果转换为所需格式(由监控项值类型定义)并将结果放入预处理队列。如果当前监控项有依赖项,则依赖项也将添加到预处理队列中。...因此,例如,预处理管理器将刷新值1、2和3,但不会刷新值 5,因为值4尚未处理: 刷新后队列中只剩下两个值(4 和 5),将值添加到预处理管理器的本地数据缓存中,然后将值从本地缓存传输到历史缓存。

    62720

    66道前端算法面试题附思路分析助你查漏补缺

    用两个栈实现队列 题目: 用两个栈来实现一个队列,完成队列的 Push 和 Pop 操作。 思路: 队列的一个基本特点是,元素先进先出。通过两个栈来模拟时,首先我们将两个栈分为栈 1 和栈 2。...当执行队列的 push 操作时,直接 将元素 push 进栈 1 中。当队列执行 pop 操作时,首先判断栈 2 是否为空,如果不为空则直接 pop 元素。...(2)由于所求数字的数量超过了数组长度的一半,因此排序后的中位数就是所求数字。因此我们可以将问题简化为求一个数组的中 位数问题。其实数组并不需要全排序,只需要部分排序。...数据流中的中位数(待深入理解) 题目: 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有值排序之后位于中间的数值。...如果数据 流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。 64. 滑动窗口中的最大值(待深入理解) 题目: 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。

    1.8K20

    剑指Offer-数据流中的中位数

    题目描述 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。...思路二: 维护一个大顶堆,一个小顶堆,且保证两点: 小顶堆里的元素全大于大顶堆里的元素; 两个堆个数的差值小于等于1; 当insert的数字个数为奇数时:使小顶堆个数比大顶堆多1;当insert的数字个数为偶数时...import java.util.ArrayList; import java.util.Collections; import java.util.PriorityQueue; /** * 数据流中的中位数...* 如何得到一个数据流中的中位数?...如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。 * 如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。

    70440
    领券