PriorityQueue(优先队列) 结合leetcode23. 合并K个升序链表 (趁热打铁,应用在算法,简化直观)

news/2024/5/19 1:09:44 标签: 数据结构, PriorityQueue, 优先级队列

PriorityQueue类是一种队列数据结构实现,其中根据优先级处理对象。它与遵循FIFO(先进先出)算法的标准队列不同。

优先级队列中,添加的对象根据其优先级。默认情况下,优先级由对象的自然顺序决定。队列构建时提供的比较器可以覆盖默认优先级。

1. PriorityQueue功能

让我们记下PriorityQueue上的几个要点。

  • PriorityQueue是一个无限制的队列,并且动态增长。默认初始容量'11'可以使用相应构造函数中的initialCapacity参数覆盖。
  • 它不允许NULL对象。
  • 添加到PriorityQueue的对象必须具有可比性。
  • 默认情况下,优先级队列的对象按自然顺序排序
  • 比较器可用于队列中对象的自定义排序。
  • 优先级队列头部是基于自然排序或基于比较器的排序的最小元素。当我们轮询队列时,它从队列中返回头对象。
  • 如果存在多个具有相同优先级的对象,则它可以随机轮询其中任何一个。
  • PriorityQueue 不是线程安全的PriorityBlockingQueue在并发环境中使用。
  • 它为add和poll方法提供了O(log(n))时间。

1. PriorityQueue功能

让我们看看对象的排序如何影响PriorityQueue中的添加和删除操作

//测试优先级队列
public class a_test_PriorityQueue {
    public static void main(String[] args) {
        PriorityQueue queue = new PriorityQueue(5, new Comparator<Integer>() {
            @Override    //重写的比较 对象的大小发方法 
            public int compare(Integer o1, Integer o2) {
                return o1-o2;
            }
        });

        queue.add(3);  //乱序添加数据
        queue.add(1);
        queue.add(5);
        queue.add(2);
        queue.add(4);

        while( !queue.isEmpty()){
            Integer m = (Integer) queue.poll();
           System.out.print(m + " ");
        }
    }
}

 

结果输出,是顺序的,他存入的时候就是顺序的,自己debug 尝试

 

3. Java PriorityQueue构造函数

PriorityQueue类提供了6种在Java中构造优先级队列的方法。

  • PriorityQueue():使用默认初始容量(11)构造空队列,该容量根据其自然顺序对其元素进行排序。
  • PriorityQueue(Collection c):构造包含指定集合中元素的空队列。
  • PriorityQueue(int initialCapacity):构造具有指定初始容量的空队列,该容量根据其自然顺序对其元素进行排序。
  • PriorityQueue(int initialCapacity,Comparator comparator):构造具有指定初始容量的空队列,该容量根据指定的比较器对其元素进行排序。
  • PriorityQueuePriorityQueue c):构造包含指定优先级队列中元素的空队列。
  • PriorityQueue(SortedSet c):构造包含指定有序集合中元素的空队列。

4. Java PriorityQueue方法

PriorityQueue类下面给出了重要的方法,你应该知道。

  • boolean add(object):将指定的元素插入此优先级队列
  • boolean offer(object):将指定的元素插入此优先级队列
  • boolean remove(object):从此队列中删除指定元素的单个实例(如果存在)。
  • Object poll():检索并删除此队列的头部,如果此队列为空,则返回null。
  • Object element():检索但不删除此队列的头部,如果此队列为空,则返回null。
  • Object peek():检索但不删除此队列的头部,如果此队列为空,则返回null。
  • void clear():从此优先级队列中删除所有元素。
  • Comparator comparator():返回用于对此队列中的元素进行排序的比较器,如果此队列根据其元素的自然顺序排序,则返回null。
  • boolean contains(Object o):如果此队列包含指定的元素,则返回true。
  • Iterator iterator():返回此队列中元素的迭代器。
  • int size():返回此队列中的元素数。
  • Object [] toArray():返回包含此队列中所有元素的数组。

例题: leetcode 23合并K个升序链表

链接:https://leetcode.cn/problems/merge-k-sorted-lists

 解决:

    //1.使用队列,可比较性的队列,先得到所有的元素在 队列中,然后再去添加到链表
    public static ListNode mergeKLists(ListNode[] lists) {
        if (lists == null || lists.length == 0) return null;
        PriorityQueue<ListNode> queue =  //这是一种优先队列的方式 (具有优先级)
                new PriorityQueue<>(lists.length, new Comparator<ListNode>() {
                    @Override  //重写的比较的方法 ,表示队列元素是可以比较的
                    public int compare(ListNode o1, ListNode o2) {
                        if (o1.val < o2.val) return -1;
                        else if (o1.val == o2.val) return 0;
                        else return 1;
                    }
                });
        ListNode dummy = new ListNode(0);
        ListNode p = dummy;
        for (ListNode node : lists) {  //把k 个链表 都放入队列中
            if (node != null) queue.add(node);
        }
        while (!queue.isEmpty()) { //再从队列中 出元素,
            ListNode minNode = queue.poll();  //得到一个小元素
            p.next=minNode;  //p 则执行这个小元素
            p = minNode;  //p 向后移动
            if (minNode.next!=null){
                queue.add(minNode.next);
            }

        return dummy.next;
    }


http://www.niftyadmin.cn/n/1712479.html

相关文章

阿里2018秋招在线编程题

本质是求最长的递增子序列长度&#xff01; 实现的代码为&#xff1a; #include<iostream> using namespace std; void LengthLIS(int arr[],int N){int len[N],i,j,MaxLength1;int lenArr[N][N];for(i0;i<N;i)len[i]1;for(i0;i<N;i)lenArr[i][0]arr[i];for(i0;i…

数据结构篇:邻接表创建与显示

每一个顶点后面就是一条链表&#xff0c;每个顶点都存在数组里。 以这张图为例 结构如下 运行截图 结构体定义 //边表结点 typedef struct EdgeNode {//顶点对应的下标int adjvex;//指向下一个邻接点struct EdgeNode *next; } edgeNode;//顶点表结点 typedef struct VertexNo…

php mail插件,WINDOWS7系统中的PHP环境使用sendmail插件和mail()发送邮件

win7系统不再自带smtp设置&#xff0c;因此用php的mail函数就必须利用第三方的软件发送&#xff0c;此处介绍sendmail插件。(本章以下内容为转载)1.从http://glob.com.au/sendmail/下载sendmail.zip2.解压到C:下&#xff0c;例如C:\PHP\sendmail&#xff0c;最好短路径&#xf…

动态规划算法之最长递增子序列问题

转载自&#xff1a; https://blog.csdn.net/tterminator/article/details/50957527 一、问题描述 在数字序列A中&#xff0c;按下标递增的顺序选出一个子序列B&#xff0c;如果选出的子序列B是严格递增的&#xff0c;则该子序列B称为原数字序列A的递增子序列。最长递增子序列…

设计模式篇:状态模式(一)

当我们用Unity进行场景切换时&#xff0c;可能会写下如下代码&#xff1a; using UnityEngine; using UnityEngine.SceneManagement;public class ReverseVersion : MonoBehaviour {private string _state "到早上了";public void ChanageScene(string StateName){…

ubuntu 13.10 php,ubuntu13.10配置nginx + php + mysql +phpmyadmin环境

1. 使用官方PPA安装 Nginx 最新版本&#xff0c;使用以下命令&#xff1a;代码如下sudo add-apt-repository ppa:nginx/stablesudo apt-get updatesudo apt-get install nginxNginx相关控制命令&#xff1a;启动 Nginx&#xff1a;sudo /etc/init.d/nginx start浏览器浏览运行情…

杭电oj1042 N!

#include<iostream> #include<string> #include<algorithm> using namespace std; int jia(int r[]){//自增1函数 int t;r[0]r[0]1;for(int i0;i<5;i){//把数存进数组里面 if(r[i]>10)//例如1234&#xff0c;r[0]4,r[1]3,r[2]2,r[3]1 r[i1]r[i1]1;//s[…

MySQL中的字段约束条件

讲师&#xff1a;尚硅谷-宋红康&#xff08;江湖人称&#xff1a;康师傅&#xff09;转自 b 站 mysql2022视频笔记&#xff09; 官网&#xff1a;http://www.atguigu.com 1. 约束(constraint)概述 1.1 为什么需要约束 数据完整性&#xff08;Data Integrity&#xff09;是指…