[leetcode栈队列]2 数据流中的第K大元素

网友投稿 210 2022-10-18


[leetcode栈队列]2 数据流中的第K大元素

1思考?

什么是优先队列?什么是最小堆或最大堆?

在此大家可以先思考1分钟

顺便复习下

再看题解效果会更好哈

优先级队列

在之前的学习中,我们知道队列有着先进先出的特点。那么优先级队列是什么呢?主要体现在修饰词"优先级"三字上面。比如在一组数中,我们规定最大值先出或者最小值先出,并按照这个约束依次出队。那么从生活中例子来看,比如火车站窗口通常都有军人优先的类似字样,因为这些特性让其有了特殊权利,他们就可以先买票。

小顶堆及基本实现机制

小顶堆是如下图树的形式(树和图等后续再详细介绍)。节点值越小的越在前面,自然堆顶(10)就是最小的元素。其实现机制主要采用二叉堆,二叉搜索树,斐波那契堆等。

1Leetcode703 数据流中第k大元素

设计一个找到数据流中第K大元素的类(class)。注意是排序后的第K大元素,不是第K个不同的元素。

你的 KthLargest 类需要一个同时接收整数 k 和整数数组nums 的构造器,它包含数据流中的初始元素。每次调用 KthLargest.add,返回当前数据流中第K大的元素。

示例:

int k = 3;

int[] arr = [4,5,8,2];

KthLargest kthLargest = new KthLargest(3, arr);

kthLargest.add(3);   // returns 4

kthLargest.add(5);   // returns 5

kthLargest.add(10);  // returns 5

kthLargest.add(9);   // returns 8

kthLargest.add(4);   // returns 8

说明:你可以假设 nums 的长度≥ k-1 且k ≥ 1。

0

1

题目解析

保存前k个最大的值,每次进来一个元素A,如果元素A比这k个元素中的最小值还要小就踢出去。那么我们如何保存这k个数呢?每进来一个数,和其中k个数进行排序,假设使用快速排序,其整体的时间复杂度为O(n*k*logk).采用优先级队列。维护一个k个元素的小顶堆,优先级从小到大排列,最上面为最小的元素,每次元素过来,就有两种情况。第一种情况小于堆顶,那么就直接淘汰。第二种情况,比堆顶元素大,那么淘汰堆顶,更新堆结构,因为每次从堆中取出元素,为O(1),每调整一次堆为O(log2k)。所以整体复杂度为O(n*log2k)。

题目虽简单,细品出真理!一定掌握哈

0

2

代码实现

1  c++版本

2  python版本

3  java版本


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:[leetcode数组系列]6 合并两有序数组
下一篇:Cookie的工作原理和应用详解
相关文章

 发表评论

暂时没有评论,来抢沙发吧~