前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >[leetcode栈队列]2 数据流中的第K大元素

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

作者头像
我是程序员小贱
发布于 2020-06-05 06:39:01
发布于 2020-06-05 06:39:01
4930
举报
文章被收录于专栏:面试经验贴面试经验贴

优先级队列

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

小顶堆及基本实现机制

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

1

Leetcode703 数据流中第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-1k ≥ 1。

01

题目解析

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

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

02

代码实现

1

c++版本

2

python版本

3

java版本

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-02-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 我是程序员小贱 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
leetcode刷题(42)——703. 数据流中的第K大元素
设计一个找到数据流中第K大元素的类(class)。注意是排序后的第K大元素,不是第K个不同的元素。
老马的编程之旅
2022/06/22
1760
【优先级队列】最后一块石头的重量 && 数据流中的第 K 大元素
每一回合,从中选出两块 最重的 石头,然后将它们一起粉碎。假设石头的重量分别为 x 和 y,且 x <= y。那么粉碎的可能结果如下:
利刃大大
2025/03/15
470
LeetCode 703. 数据流中的第K大元素(优先队列)
设计一个找到数据流中第K大元素的类(class)。 注意是排序后的第K大元素,不是第K个不同的元素。
Michael阿明
2020/07/13
3340
LeetCode 703题数据流中的第K大元素(Kth Largest Element in a Stream)
https://leetcode-cn.com/problems/kth-largest-element-in-a-stream/
code随笔
2020/04/14
3260
算法:优先队列-实战
这个arr数组要是比较小,可以直接用快速排序,再输出第K大的值。时间复杂度O(N*K*logk)
营琪
2019/11/04
5930
【day04】力扣(LeetCode)每日一刷[1306. 跳跃游戏 III ][703. 数据流中的第 K 大元素 ][1337. 矩阵中战斗力最弱的 K 行]
解题思路: 题目要求数据流数组中的第k大元素,只需要将元素都放到最小堆中,堆节点数大于k就删除堆顶节点来调整,让堆节点数保持在k个,这么一来堆顶元素就是我们要求的第k大元素。
.29.
2022/11/15
2650
【day04】力扣(LeetCode)每日一刷[1306. 跳跃游戏 III ][703. 数据流中的第 K 大元素 ][1337. 矩阵中战斗力最弱的 K 行]
LeetCode *703. 数据流中的第 K 大元素(堆)
设计一个找到数据流中第 k 大元素的类(class)。注意是排序后的第 k 大元素,不是第 k 个不同的元素。
SakuraTears
2022/01/13
5310
PriorityQueue 解析
Java 1.5版本后就提供了一个具备了小根堆性质的数据结构也就是优先队列PriorityQueue。
全栈程序员站长
2022/08/14
3090
PriorityQueue 解析
用javascript分类刷leetcode18.队列(图文视频讲解)1
队列的特点:先进先出(FIFO)队列的时间复杂度:入队和出队O(1),查找O(n)优先队列:priorityQueue,按优先级出队,实现 Heap(Binary,Fibonacci...)js里没有队列,但是可以用数组模拟图片347. 前 K 个高频元素 (medium)给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。示例 1:输入: nums = 1,1,1,2,2,3, k = 2输出: 1,2示例 2:输入: nums = 1, k
hellocoder2028
2023/01/03
7620
搞定大厂算法面试之leetcode精讲18.队列
搞定大厂算法面试之leetcode精讲18.队列 视频讲解(高效学习):点击学习 目录: 1.开篇介绍 2.时间空间复杂度 3.动态规划 4.贪心 5.二分查找 6.深度优先&广度优先 7.双指针 8.滑动窗口 9.位运算 10.递归&分治 11剪枝&回溯 12.堆 13.单调栈 14.排序算法 15.链表 16.set&map 17.栈 18.队列 19.数组 20.字符串 21.树 22.字典树 23.并查集 24.其他类型题 队列的特点:先进先出(FIFO) 队列的时间复杂度:入队和出队O(1),查找
全栈潇晨
2021/12/03
6650
求前 K 个高频元素和队列有啥关系
https://leetcode-cn.com/problems/top-k-frequent-elements/
代码随想录
2021/07/16
6610
栈与队列:求前 K 个高频元素和队列有啥关系?
题目链接:https://leetcode-cn.com/problems/top-k-frequent-elements/
代码随想录
2020/09/21
4420
栈与队列:求前 K 个高频元素和队列有啥关系?
数据结构与算法(4)——优先队列和堆什么是优先队列?堆和二叉堆LeetCode相关题目整理
听这个名字就能知道,优先队列也是一种队列,只不过不同的是,优先队列的出队顺序是按照优先级来的;在有些情况下,可能需要找到元素集合中的最小或者最大元素,可以利用优先队列ADT来完成操作,优先队列ADT是一种数据结构,它支持插入和删除最小值操作(返回并删除最小元素)或删除最大值操作(返回并删除最大元素);
我没有三颗心脏
2018/07/24
1.3K0
数据结构与算法(4)——优先队列和堆什么是优先队列?堆和二叉堆LeetCode相关题目整理
【java-数据结构】Java优先级队列揭秘:堆的力量让数据处理飞起来
在开发中,尤其是需要处理大量数据或者进行任务调度的场景下,如何高效地管理数据的顺序和优先级是一个至关重要的问题。Java 提供了优先级队列(PriorityQueue),它基于堆(Heap)实现,能够以高效的方式管理数据的优先级。在本文中,我们将深入探讨优先级队列的工作原理,特别是堆的作用,并通过示例代码帮助你更好地理解其应用。
学无止尽5
2025/03/05
1350
【java-数据结构】Java优先级队列揭秘:堆的力量让数据处理飞起来
理解堆和优先队列
数据结构中的堆区别于内存分配的堆,我们说的用于排序的堆是一种表示元素集合的结构,堆是一种二叉树。
C语言与CPP编程
2020/12/02
1K0
理解堆和优先队列
【高效算法解析:从树的遍历到数据流处理的经典题解】—— LeetCode
用户11286421
2025/03/14
590
【高效算法解析:从树的遍历到数据流处理的经典题解】—— LeetCode
LeetCode | 703.数据流中的第K大元素
上面的题就是 数据流中的第K大元素 题目的截图,同时 LeetCode 给出了一个类的定义,然后要求实现 数据流中的第K大元素 的完整的算法。这次我同样没有使用 C 语言,而是使用了 C++ 语言,整个类的定义如下:
码农UP2U
2020/08/26
3580
LeetCode | 703.数据流中的第K大元素
leetcode:数组中的第K个最大元素
请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。
利刃大大
2023/04/12
5410
算法思想总结:优先级队列
我们每次都要快速找到前两个最大的石头进行抵消,这个时候用优先级队列(建大堆),不断取堆顶元素是最好的!每次删除堆顶元素后,可以自动调整,时间复杂度是logN。
小陈在拼命
2024/07/16
1880
算法思想总结:优先级队列
图文详解二叉堆,实现优先级队列
二叉堆(Binary Heap)没什么神秘,性质比二叉搜索树 BST 还简单。其主要操作就两个,sink(下沉)和swim(上浮),用以维护二叉堆的性质。其主要应用有两个,首先是一种排序方法「堆排序」,第二是一种很有用的数据结构「优先级队列」。
灵魂画师牧码
2019/08/02
1.7K0
推荐阅读
相关推荐
leetcode刷题(42)——703. 数据流中的第K大元素
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文