Java优先队列 priority queue

yizhihongxing

Java优先队列 priority queue 完整攻略

Java中的优先队列是一种特殊的队列,它允许在添加元素时指定一个优先级,并且在取出元素时总是取出当前队列中优先级最高的元素。内部实现采用堆来维护元素的优先级,时间复杂度为 O(log n)。

基本使用方法

Java提供了PriorityQueue类来实现优先队列,其默认是按照元素的自然顺序来排序的,也可以通过构造器提供一个Comparator来指定元素的排序规则。

// 创建一个默认的优先队列
PriorityQueue<Integer> pq = new PriorityQueue<>();
// 添加元素
pq.add(3);
pq.add(1);
pq.add(2);
// 取出元素,如果队列为空,则返回null
while (!pq.isEmpty()) {
    System.out.println(pq.poll());
}

上述代码输出结果为:

1
2
3

自定义排序规则

如果需要自定义元素的排序规则,可以通过实现Comparator接口来实现。

// 按照元素的长度来排序的比较器
Comparator<String> cmp = new Comparator<String>() {
    @Override
    public int compare(String s1, String s2) {
        return s1.length() - s2.length();
    }
};
PriorityQueue<String> pq = new PriorityQueue<>(cmp);
pq.add("java");
pq.add("python");
pq.add("c++");
pq.add("php");
while (!pq.isEmpty()) {
    System.out.println(pq.poll());
}

上述代码输出结果为:

php
java
c++
python

示例一:使用优先队列解决TOP K问题

TOP K问题是指从一个数列中查找出前K个最大或最小的数,可以使用最大或最小堆来解决。下面给出一个使用优先队列来解决TOP K问题的示例。

int[] nums = {3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5};
int k = 3;
PriorityQueue<Integer> pq = new PriorityQueue<>(k);
for (int num : nums) {
    if (pq.size() < k) {
        pq.add(num);
    } else if (num > pq.peek()) {
        pq.poll();
        pq.add(num);
    }
}
while (!pq.isEmpty()) {
    System.out.println(pq.poll());
}

上述代码输出结果为:

5
5
6

示例二:合并K个有序链表

给定K个有序链表,将它们合并成一个有序链表,可以使用优先队列来实现。

public ListNode mergeKLists(ListNode[] lists) {
    PriorityQueue<ListNode> pq = new PriorityQueue<>(Comparator.comparingInt(o -> o.val));
    for (ListNode node : lists) {
        if (node != null) {
            pq.add(node);
        }
    }
    ListNode dummy = new ListNode(-1);
    ListNode tail = dummy;
    while (!pq.isEmpty()) {
        ListNode node = pq.poll();
        tail.next = node;
        tail = tail.next;
        if (node.next != null) {
            pq.add(node.next);
        }
    }
    return dummy.next;
}

以上代码中的ListNode是链表节点的定义,比较函数采用了Java8中的新特性,这里使用Comparator.comparingInt(o -> o.val)来按照链表节点的值进行比较。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java优先队列 priority queue - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • Shell脚本获取本地网卡IP、mac地址、子网掩码、dns IP、外网IP

    Shell脚本获取本地网卡IP、mac地址、子网掩码、DNS IP、外网IP的攻略 在Shell脚本中,可以使用一些命令和工具来获取本地网卡IP、mac地址、子网掩码、DNS IP和外网IP。下面是一个完整的攻略,包含了两个示例说明。 步骤1:获取本地网卡信息 首先,我们需要获取本地网卡的信息,包括IP地址、mac地址和子网掩码。可以使用ifconfig命令…

    other 2023年7月31日
    00
  • 用php写一个最简单的解释器part4(写一个最简单的脚本语言)

    用php写一个最简单的解释器part4(写一个最简单的脚本语言) 在前几篇文章中,我们已经介绍了如何用PHP来写一个最简单的解释器,可以解释加、减、乘、除四种运算。在本篇文章中,我们将会进一步发挥这个解释器,给它加上支持变量和输出的能力,从而写出一个最简单的脚本语言。 语法规则 我们的脚本语言支持如下几个语法规则: 变量赋值:使用 “=” 符号给一个变量赋值…

    其他 2023年3月28日
    00
  • 苹果手机自定义键盘输出字符和短语设置(手工修改键盘快捷输入字符)

    苹果手机的自定义键盘功能可以帮助我们快速输入常用的短语和单词,提高打字效率。下面是关于如何手工修改键盘快捷输入字符的详细攻略。 步骤一:打开自定义键盘设置页面 首先在苹果手机上打开设置应用,选择“通用”选项,然后点击“键盘”。在键盘页面中选择“文本替换”选项即可进入自定义键盘设置页面。 步骤二:添加新的快捷输入字符 在自定义键盘设置页面中,点击右上角的“+”…

    other 2023年6月25日
    00
  • 在androidsdk文件夹中找不到sdkmanager.exe

    以下是关于“在androidsdk文件夹中找不到sdkmanager.exe”的完整攻略,包括基本知识和两个示例。 基本知识 在开发中我们需要安装Android SDK来开发和测试Android应用程序。在安装Android SDK后,我们使用SDK Manager来管理和更新SDK件。但是,时候我们可能会遇到“在androidsdk文件夹中找不到sdkma…

    other 2023年5月7日
    00
  • C++中的运算符和运算符优先级总结

    C++中的运算符和运算符优先级总结 1. 运算符 C++中的运算符用于在表达式中执行特定的操作,例如算术运算、逻辑运算等。下面是常见的运算符分类: 算术运算符 算术运算符用于执行基本的算术操作。常见的算术运算符包括加法(+)、减法(-)、乘法(*)、除法(/)和取模(%)。 示例1:计算两个数的和 int a = 10; int b = 5; int sum…

    other 2023年6月28日
    00
  • Spring超详细讲解IOC与解耦合

    下面我将为您分享“Spring超详细讲解IOC与解耦合”的攻略。 Spring超详细讲解IOC与解耦合 什么是IOC IOC全称为Inversion of Control,即控制反转。它是指在开发中,将对象的创建和对象之间的调用交给Spring容器去完成,而不是由程序员主动去创建和调用,从而实现对象之间的解耦合。 IOC的实现原理 Spring通过IOC容器…

    other 2023年6月27日
    00
  • MySQL中给自定义的字段查询结果添加排名的方法

    要在MySQL中给自定义的字段查询结果添加排名,可以使用MySQL提供的用户变量来实现。具体的步骤如下: 1.首先,需要先使用SELECT语句查询出需要添加排名的字段。例如,查询出某个表中的成绩字段。 SELECT score FROM student; 2.在SELECT语句中使用用户变量,同时将变量初始化为0。 SELECT score, (@rank …

    other 2023年6月25日
    00
  • qmenu与qmenubar

    qmenu与qmenubar Qt是一个功能强大的跨平台应用程序开发框架。它提供了一系列的UI控件来简化应用程序的开发。其中包括QMenu和QMenuBar。 QMenu是一个用于在应用程序界面上创建弹出菜单的小部件。它可以包含各种动作项,例如操作、复选框、单选按钮以及分隔符等。QMenu很容易使用,可以通过QAction、QIcon和键盘快捷键创建动作项。…

    其他 2023年3月28日
    00
合作推广
合作推广
分享本页
返回顶部