java优先级队列(PriorityQueue)

java优先级队列(PriorityQueue)

什么是优先级队列?

其实就是⼀个披着队列外⾐的堆。因为优先级队列对外接⼝只是从队头取元素,从队尾添加元素,再⽆其他取元素的⽅式,看起来就是⼀个队列。与队列的区别在于优先级队列内部元素是⾃动依照元素的权值排列。
在Java中,优先队列是通过java.util.PriorityQueue类实现的,不允许null元素。默认情况下,此队列是按照自然顺序排序的。java当中本身没有堆这个数据结构,如果想使用堆的话,可以通过优先队列来创建。

PriorityQueue的方法

  1. 三种常用的构造方法在这里插入图片描述
import java.util.ArrayList;
import java.util.List;
import java.util.PriorityQueue;
 
public class TestPriorityQueue {
    public static void main(String[] args) {
        PriorityQueue<Integer> p1 = new PriorityQueue<>(); //容量默认为11
        PriorityQueue<Integer> p2 = new PriorityQueue<>(10); //参数为初始容量
        List<Integer> list = new ArrayList<>();
        list.add(0);
        list.add(1);
        list.add(2);
        PriorityQueue<Integer> p3 = new PriorityQueue<>(list); //使用集合list作为参数构造优先 
                                                               // 级队列
    }
}
  1. 构造大堆
    PriorityQueue默认是小堆,如果想要创建大堆可以重写compare方法创建:
PriorityQueue<Integer> pq = new PriorityQueue<>(new Comparator<Integer>() {
    @Override
    public int compare(Integer o1, Integer o2) {
        return o2-o1;
    }
});
  1. 常用方法
    在这里插入图片描述

Top-k问题

题目描述:
给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。
请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。

示例:

  • 输入:[3,2,1,5,6,4], k = 2
  • 输出:5

代码:

class Solution {
    public int findKthLargest(int[] nums, int k) {
        PriorityQueue<Integer> heap = new PriorityQueue<Integer>();
        for(int i = 0;i<nums.length;i++){
            if(heap.size()<k){
                heap.offer(nums[i]);
            }else{
                if(nums[i]>heap.peek()){
                    heap.poll();
                    heap.offer(nums[i]);
                }
            }
        }
        return heap.peek();
    }
}
  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值