• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
haipali
博客园    首页    新随笔    联系   管理    订阅  订阅

算法 -- 数据流中的第K大数

原题:
703. 数据流中的第 K 大元素
简单
417
相关企业
设计一个找到数据流中第 k 大元素的类(class)。注意是排序后的第 k 大元素,不是第 k 个不同的元素。

请实现 KthLargest 类:

KthLargest(int k, int[] nums) 使用整数 k 和整数流 nums 初始化对象。
int add(int val) 将 val 插入数据流 nums 后,返回当前数据流中第 k 大的元素。

示例:

输入:
["KthLargest", "add", "add", "add", "add", "add"]
[[3, [4, 5, 8, 2]], [3], [5], [10], [9], [4]]
输出:
[null, 4, 5, 5, 8, 8]

解释:
KthLargest kthLargest = new KthLargest(3, [4, 5, 8, 2]);
kthLargest.add(3); // return 4
kthLargest.add(5); // return 5
kthLargest.add(10); // return 5
kthLargest.add(9); // return 8
kthLargest.add(4); // return 8

提示:
1 <= k <= 104
0 <= nums.length <= 104
-104 <= nums[i] <= 104
-104 <= val <= 104
最多调用 add 方法 104 次
题目数据保证,在查找第 k 大元素时,数组中至少有 k 个元素

解析:
说实话,一开始看到这题是懵的,看不懂题,后来能理解了
KthLargest(int k, int[] nums)方法表示给你数据流nums,和要找的第K大的数的参数k

题解里使用了Java优先队列PriorityQueue
详细说明在这里:Java 优先队列(PriorityQueue)总结
简单讲一下,这个队列就是能在用户插入数据之后,自动将队列中数据进行排序
所以有了这个队列之后,写这道题轻轻松松啦
代码:

class KthLargest {
    PriorityQueue<Integer> pq;
    int k;
    public KthLargest(int k, int[] nums) {
        this.k = k;
        pq = new PriorityQueue<Integer>();
        for(int num:nums){
            pq.add(num);
        }
    }
    
    public int add(int val) {
        pq.offer(val);
        while(true){
            if(pq.size()>k){
                pq.poll();
            }else{
                break;
            }
        }
        return pq.peek();
    }
}
  • 由于队列默认按照降序排列(具体设置排列顺序我还没搞懂),将队列大小保持在k个,目的是将比(队列中第K大的数)小的数踢出队列,剩下在队列中的自然就是最大的到第K大的了,最后return pq.peek()队列最顶值,就是答案了
posted @ 2023-03-16 16:40  蓝光水母  阅读(27)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3