• LeetCode 23. Merge k Sorted Lists


    题目

    思路,维护一个最小堆。

    一开始把二维数组里的每一维的第一个元素都放到堆里。也就是第一列的元素都放到堆里。

    此后,出堆。再进堆,没次出堆,都把 出堆的元素 在数组里的下一个元素 入堆。循环这种操作。

    每次出堆的元素都是最小的。

    这样的效率就是O(n*log(n))

    one pass && faster than 94.84% of C++

    /**
     * Definition for singly-linked list.
     * struct ListNode {
     *     int val;
     *     ListNode *next;
     *     ListNode(int x) : val(x), next(NULL) {}
     * };
     */
    
    struct Node
    {
        int val;
        int index;
    } a[10005];
    
    int pos=0;
    void up()
    {
        int j=pos;
        while(j>1)
        {
            if(a[j].val<a[j/2].val)
            {
                swap(a[j],a[j/2]);
                j=j/2;
            }
            else
            {
                break;
            }
        }
    }
    
    void down()
    {
        int j=1;
        int i=j*2;
        while(i<=pos)
        {
            if(i<pos&&a[i].val>a[i+1].val)
            {
                i++;
            }
            if(a[j].val>a[i].val)
            {
                swap(a[j],a[i]);
                j=i;
                i=j*2;
            }
            else
            {
                break;
            }
        }
    }
    
    class Solution {
    public:
        ListNode* mergeKLists(vector<ListNode*>& lists) {
            
           
           for(int i=0;i<lists.size();i++)
           {
               if(lists[i]!=NULL)
               {
                  a[++pos].val=lists[i]->val; 
                  a[pos].index=i;
                    
                  up();
                  lists[i]=lists[i]->next;
                }
            }
            ListNode* ans = new ListNode(0);
            ListNode* res = ans;
            int id=0;
            while(pos>=1)
            {
                res->next =  new ListNode(a[1].val);
                res=res->next;
                id = a[1].index;
                
                a[1]=a[pos];
                pos--;
                down();
                
                if(lists[id]!=NULL){
                    a[++pos].val=lists[id]->val;
                    a[pos].index=id;
                    up();
                    
                    lists[id] = lists[id]->next;
                }
            }
            
            return ans->next;
            
        }
    };
    
  • 相关阅读:
    4、配置解决中文乱码的过滤器
    3、请求参数绑定
    2、SpringMVC常用注解
    SpringMVC快速搭建
    深拷贝与浅拷贝笔记
    SpringBoot入门(三)——SpringData JPA
    SpringBoot入门(二)——Web
    SpringBoot入门(一)——HelloWorld、配置、日志
    Java SSM(十八)——Mybatis查缺补漏
    Java SSM(十七)——SpringMVC查缺补漏
  • 原文地址:https://www.cnblogs.com/dacc123/p/11127098.html
Copyright © 2020-2023  润新知