• Merge k Sorted Lists


    priority_queue()讲解:

    priority_queue 优先级队列是一个拥有权值概念的单向队列queue,在这个队列中,所有元素是按优先级排列的(也可以认为queue是个按进入队列的先后做为优先级的优先级队列——先进入队列的元素优先权要高于后进入队列的元素)。在计算机操作系统中,优先级队列的使用是相当频繁的,进线程调度都会用到。在STL的具体实现中,priority_queue也是默认以vector作为底部结构,再根据堆的处理规则来调整元素之间的位置。缺省情况下以是max-heap。

    priority_queue调用 STL里面的 make_heap(), pop_heap(), push_heap() 算法实现。

    priority_queue 对于基本类型的使用方法相对简单。他的模板声明带有三个参数:
    priority_queue<Type, Container, Functional>
    其中Type 为数据类型, Container 为保存数据的容器,Functional 为元素比较方式。
    Container 必须是用数组实现的容器,比如 vector, deque 但不能用 list.
    STL里面默认用的是 vector. 比较方式默认用 operator< , 所以如果你把后面俩个参数缺省的话,
    优先队列就是大顶堆,队头元素最大。

    如果要用到小顶堆,则一般要把模板的三个参数都带进去。

    对于自定义数据类型,则必须自己重载 operator< 或者自己写仿函数

    对于自定义时,还需要了解heap的特性:一般对于一个数组:make_heap()可以对数组进行排序,如果是大根堆,则最大的元素在头(begin)

                                                                              当数组容器 新增加 一个元素放置于末尾,这时可调用push_heap()进行重排,

                                                                              pop_heap()可以取出最大元素放置于数组末尾,还未删除。

          《STL源码剖析》P181有详细例子。

    http://www.cnblogs.com/flyoung2008/articles/2136485.html是讲解priority_queue的原理以及仿写。

    回到题目:代码如下

     1 class Solution {
     2 public:
     3      struct PNode{
     4          int index;
     5          ListNode* pnode;
     6          PNode(int _index=0,ListNode* _pnode=NULL):index(_index),pnode(_pnode){}
     7          bool operator < (const PNode& x )const
     8          {
     9              return pnode->val > x.pnode->val;
    10          }
    11      };
    12      ListNode* mergeKLists(vector<ListNode*>& lists) {
    13       priority_queue<PNode> min;
    14       ListNode dummy(-1);
    15       ListNode*prev =&dummy;
    16       for(int i=0;i<lists.size();i++)
    17        if(lists[i]!=NULL)
    18        {
    19            min.push(PNode(i,lists[i]));
    20            lists[i]=lists[i]->next;
    21        }
    22        while(!min.empty())
    23        {
    24            prev->next=min.top().pnode;
    25            prev=prev->next;
    26            int index=min.top().index;
    27            min.pop();
    28            if(lists[index]!=NULL)
    29            {
    30                min.push(PNode(index,lists[index]));
    31                lists[index]=lists[index]->next;
    32            }
    33        }
    34        prev->next=NULL;
    35        return dummy.next;
    36      
    37    
    38     }
    39 };

          

  • 相关阅读:
    MongoDB 基础
    类加载流程,类加载机制及自定义类加载器详解
    Object中有哪些方法及其作用
    Intellij IDEA 导入Maven项目
    用IDEA开发Spring程序
    深入浅出 Java 8 Lambda 表达式
    UUID.randomUUID()简单介绍
    json字符串转成 json对象 json对象转换成java对象
    字符串转 Boolean 的正确方式
    获取JSON中所有的KEY
  • 原文地址:https://www.cnblogs.com/daocaorenblog/p/5264527.html
Copyright © 2020-2023  润新知