zoukankan      html  css  js  c++  java
  • java优先队列,以及如何自定义优先队列的插入顺序-算法题-笔试考过

     

    思路:我们需要维护当前每个链表没有被合并的元素的最前面一个,kk 个链表就最多有 kk 个满足这样条件的元素,每次在这些元素里面选取 val 属性最小的元素合并到答案中。在选取最小元素的时候,我们可以用优先队列来优化这个过程。

    作者:LeetCode-Solution
    链接:https://leetcode-cn.com/problems/merge-k-sorted-lists/solution/he-bing-kge-pai-xu-lian-biao-by-leetcode-solutio-2/
    来源:力扣(LeetCode)
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    代码:

    /**
     * Definition for singly-linked list.
     * public class ListNode {
     *     int val;
     *     ListNode next;
     *     ListNode() {}
     *     ListNode(int val) { this.val = val; }
     *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
     * }
     */
    class Solution {
        class Status implements Comparable<Status> {
            // 某个节点的数值与指针
            int val;
            ListNode ptr;
            // 构造函数
            public Status(int val, ListNode ptr) {
                this.val = val;
                this.ptr = ptr;
            }
            // 在优先队列里面,以升序排列
            public int compareTo(Status status2) {
                return this.val - status2.val;
            }
        }
        public ListNode mergeKLists(ListNode[] lists) {
            // 创建优先队列
            PriorityQueue<Status> queue = new PriorityQueue<>();
            ListNode pre = new ListNode(0);
            ListNode preHead = pre;
            // 我们需要维护当前每个链表没有被合并的元素的最前面一个,k 个链表就最多有 k 个满足这样条件的元素,每次在这些元素里面选取 val 属性最小的元素合并到答案中。在选取最小元素的时候,我们可以用优先队列来优化这个过程。
            for (ListNode node : lists) {
                if (node != null) {
                    queue.offer(new Status(node.val, node));
                }
            }
            while (!queue.isEmpty()) {
                // 取出优先队列的头元素,也就是最小元素
                Status cur = queue.poll();
                // 连接到pre节点上
                pre.next = cur.ptr;
                pre = pre.next;
                // 把这个最小元素的next加入优先队列
                if (cur.ptr.next != null) {
                    queue.offer(new Status(cur.ptr.next.val, cur.ptr.next));
                }
            }
            return preHead.next;
        }
    }
  • 相关阅读:
    【python爬虫实战】使用词云分析来分析豆瓣影评数据
    【python爬虫实战】爬取豆瓣影评数据
    【个人博客设计】开发工具篇
    使用xmake优雅地描述工程
    使用lua实现try-catch异常捕获
    tbox新增stackless协程支持
    如何快速构建一个简单的程序
    手写数字识别系统之倾斜矫正
    手写数字识别系统之图像分割
    聊聊原子操作那些事
  • 原文地址:https://www.cnblogs.com/lzh1043060917/p/15238335.html
Copyright © 2011-2022 走看看