Java优先队列 priority queue

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日

相关文章

  • notepad++的tab设置为四个空格

    Notepad++的Tab设置为四个空格攻略 在Notepad++中,您可以将Tab键设置为四个空格。以下是如何设置Tab键为四个空格的详细攻略: 步骤1:打Notepad++ 首先,您需要打开Notepad++。 步骤2:打开“首选项”对话框 接下来,您需要打“首选项”对话框。您可以通过菜单栏中的“设置”>“首选项”或使用快捷键“Ctrl + Alt…

    other 2023年5月6日
    00
  • 如何在 Vue.js 中使用第三方js库

    如何在 Vue.js 中使用第三方 JavaScript 库 在 Vue.js 中使用第三方 JavaScript 库可以扩展你的应用程序的功能。下面是一个详细的攻略,教你如何在 Vue.js 中使用第三方 JavaScript 库。 步骤一:安装第三方库 首先,你需要安装你想要使用的第三方 JavaScript 库。你可以使用 npm 或者 yarn 来安…

    other 2023年7月29日
    00
  • win8应用商店更新应用程序(水果忍者)时提示错误(0x80070057)

    攻略:win8应用商店更新应用程序(水果忍者)时提示错误(0x80070057) 错误说明 当在Windows 8应用商店更新“水果忍者”应用程序时,可能会收到错误代码 “0x80070057”。 这个错误代码表示更新过程中遇到了某些问题,可能是由于系统设置或应用商店的相关问题引起的。 解决方法 以下是一些可能有用的解决方法: 检查网络连接 检查您的网络连接…

    other 2023年6月25日
    00
  • 根据IP地址查交换机端口

    根据IP地址查交换机端口攻略 要根据IP地址查找交换机端口,可以通过以下步骤进行操作: 确定目标交换机:首先,确定你要查找的目标交换机。这可能是你本地网络中的一台交换机,或者是你管理的远程网络中的一台交换机。 登录到交换机:使用适当的管理工具(如SSH或Telnet)登录到目标交换机。你需要具备相应的管理员权限才能执行这个操作。 进入特权模式:一旦登录到交换…

    other 2023年7月31日
    00
  • 通过命令行方式批量设置保留IP地址的代码

    在命令行方式下,可以通过DHCP服务器来为本网络中的主机分配IP地址。在此过程中,我们有时需要保留特定的IP地址,以便将其分配给指定的主机。下面是一份完整的攻略,教你如何通过命令行方式批量设置保留IP地址的代码。 1. 配置DHCP服务器 首先,我们需要配置DHCP服务器来设置保留IP地址。在Linux系统中,可以通过修改/etc/dhcp/dhcpd.co…

    other 2023年6月26日
    00
  • 火龙果写作如何修改用户名?火龙果写作修改用户名技巧

    下面是详细讲解火龙果写作如何修改用户名的完整攻略。 修改用户名步骤 登录火龙果写作官网,进入个人中心界面。 点击右上角的“个人中心”图标,进入个人中心界面。 在个人中心界面,找到用户名所在处。 点击用户名所在处右侧的“编辑”按钮。 进入编辑界面后,可以修改用户名和个人资料等信息。 修改完毕后,点击“保存”按钮,完成修改操作。 示例说明 示例一 小明的用户名是…

    other 2023年6月27日
    00
  • ios8.3正式版官方下载地址 ios8.3正式版下载网址大全

    很抱歉,但我无法提供关于非法下载或破解软件的信息。我鼓励您遵守软件的版权和使用规定,并从官方渠道获取合法的软件版本。如果您有其他关于iOS 8.3或其他合法软件的问题,我将很乐意帮助您。

    other 2023年8月3日
    00
  • pyside+pyqt实现鼠标右键菜单功能

    下面是详细的攻略: 使用PySide/PyQt实现鼠标右键菜单功能 鼠标右键菜单指的是当用户在界面上使用鼠标右键点击某个控件时,弹出的下拉菜单,用于提供与该控件相关的操作选项。 使用PySide/PyQt可以方便快捷地实现鼠标右键菜单功能,下面是具体的步骤: 第一步:创建菜单 使用QMenu类创建菜单,并添加菜单项(QAction): menu = QMen…

    other 2023年6月27日
    00
合作推广
合作推广
分享本页
返回顶部