题目:703.数据流中的第 k 大元素

题目来源:

        leetcode题目,网址:703. 数据流中的第 K 大元素 - 力扣(LeetCode)

解题思路:

       初始化时,初始化 list,记录所给整数 k 并且调用 add 函数逐个将 nums 数组中的元素添加到 list 。

        将元素添加值 list 中时,若 list 的大小为0,直接将所给元素添加至 list 中并返回该元素;若list 大小在区间 (0,k) 内,将该元素插入list中并将 list 按从大到小排序,返回 -1 。若 list 的大小大于 k,将该元素插入 list 中,将 list 按从大到小的规律排序并删除最后一个元素,再返回最后一个元素。

解题代码:

//保留前k个,使用二分查找查找该插入的位置
class KthLargest {
    int k;
    List<Integer> list;//降序排序
    public KthLargest(int k, int[] nums) {
        this.k=k;
        this.list=new ArrayList<>();
        for(int num:nums){
            this.add(num);
        }
    }

    
    public int add(int val) {
        if(list.size()==0){
            list.add(val);
            return val;
        }
        if(list.size()==k && list.get(k-1)>=val)
            return list.get(k-1);
        int left=0;
        int right=list.size()-1;
        int pos=-1;
        while(left<right){
            int middle=left+(right-left)/2;
            if(list.get(middle)==val){
                pos=middle;
                break;
            }else if(list.get(middle)>val){
                left=middle+1;
            }else 
                right=middle-1;
        }
        pos=pos==-1?(list.get(left)>val?left+1:left):pos;
        
        list.add(pos,val);
        if(list.size()>k){
            list.remove(list.size()-1);
        }
        
        return list.size()==k?list.get(k-1):-1;
    }
        
}

/**
 * Your KthLargest object will be instantiated and called as such:
 * KthLargest obj = new KthLargest(k, nums);
 * int param_1 = obj.add(val);
 */
//使用二分查找查找该插入的位置
class KthLargest {
    int k;
    List<Integer> list;//降序排序
    public KthLargest(int k, int[] nums) {
        this.k=k;
        Arrays.sort(nums);
        list=new ArrayList<Integer>();
        for(int i=nums.length-1;i>=0;i--){
            this.list.add(nums[i]);    
        }
    }
    
    public int add(int val) {
        if(list.size()==0){
            list.add(val);
            return val;
        }
        int left=0;
        int right=list.size()-1;
        while(left<right){
            int middle=left+(right-left)/2;
            if(list.get(middle)==val){
                list.add(middle,val);
                break;
            }else if(list.get(middle)>val){
                left=middle+1;
            }else
                right=middle-1;
        }
        if(left>=right){
            int pos=list.get(left)>val?left+1:left;
            list.add(pos,val);
        }
        return list.get(k-1);
    }
}

/**
 * Your KthLargest object will be instantiated and called as such:
 * KthLargest obj = new KthLargest(k, nums);
 * int param_1 = obj.add(val);
 */
//添加元素后排序
class KthLargest {
    int k;
    List<Integer> list;
    public KthLargest(int k, int[] nums) {
        this.k=k;
        list=new ArrayList<Integer>();
        for(int num:nums){
            this.list.add(num);    
        }
    }
    
    public int add(int val) {
        this.list.add(val);
        Collections.sort(this.list);
        return this.list.get(list.size()-k);
    }
}
 

总结:

        官方题解使用的是优先队列。

        百度百科中关于优先队列的介绍:在优先队列中,元素被赋予优先级,当访问元素时,具有最高优先级的元素最先删除。

        Java 中 PriorityQueue 默认升序排序,即较小的数字具有较高的优先级别。只要确保优先队列中元素个数为 k 个,优先队列队首元素一定为最小的元素(即第 k 大元素)。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值