当前位置 博文首页 > Inmaturity_7的博客:算法练习帖--69--数据流中的第 K 大元素(ja

    Inmaturity_7的博客:算法练习帖--69--数据流中的第 K 大元素(ja

    作者:[db:作者] 时间:2021-07-16 21:47

    数据流中的第 K 大元素(java)

    一、题目简介

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

    请实现 KthLargest 类:

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

    示例:
    输入:
    ["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 个元素
    

    二、解决方法

    1. 大根堆

    package com.lxf.test3;
    
    import java.util.*;
    
    public class KthLargest {
        public static void main(String[] args) {
            //["KthLargest","add","add","add","add","add"]
            // [[2,[0]],[-1],[1],[-2],[-4],[3]]
            KthLargest kthLargest = new KthLargest(2, new int[]{0});
            kthLargest.add(-1);
            kthLargest.add(1);
            kthLargest.add(-2);
            kthLargest.add(-4);
            kthLargest.add(3);
    
        }
        PriorityQueue<Integer> queue;
        int size;
        public KthLargest(int k, int[] nums) {
            queue= new PriorityQueue<>(k);//创建k大小容量的大根堆
            size=k;//大根堆大小
            for (int num : nums) {
                add(num);//添加数字
            }
        }
    
        public int add(int val) {
            if(queue.size()<size){
                //如果大根堆大小小于k,将这个值直接加入大根堆
                queue.offer(val);
            }else if(queue.peek()<val){
                //否则那么此时大根堆大小已经等于k了
                //此时如果加入的值大于大根堆的顶元素(也就是大于第k大的数字)
                //我们需要先移除堆顶元素,然后再加入该元素
                queue.poll();
                queue.offer(val);
            }
            return queue.peek();
        }
    }
    
    
    cs