2020-03-20 刷题2(堆)

2020-03-29  本文已影响0人  nowherespyfly

最小的k个数

采用最大堆(优先队列)的做法,首先将前k个元素入堆,剩下的元素依次与堆顶元素比较,如果更小,就将堆顶元素弹出,小元素入堆。最后堆中的k个元素就是最小的k个数。每次入堆的代价是O(logn),所以总的时间代价是O(klogn).

class Solution {
public:
    vector<int> getLeastNumbers(vector<int>& arr, int k) {
        vector<int> min_k;
        priority_queue<int> heap;
        int i = 0;
        for(; i < k; i++)
            heap.push(arr[i]);
        while(k && i < arr.size()){
            if(arr[i] < heap.top()){
                heap.pop();
                heap.push(arr[i]);
            }
            i++;
        }
        for(int i = 0; i < k; i++){
            min_k.push_back(heap.top());
            heap.pop();
        }
        return min_k;
    }
};

23 合并k个有序列表

还是用堆来做的,以ListNode*为节点建一个堆,需要重载一下比较运算符,重载的操作还是要记一下的。

class Solution {
public:
    struct cmp{
        bool operator()(ListNode *a, ListNode *b){
            return a -> val > b -> val;
        }
    };
    ListNode* mergeKLists(vector<ListNode*>& lists) {
        priority_queue<ListNode*, vector<ListNode*>, cmp> heap;
        ListNode *merge_list = new ListNode(0), *cur = merge_list;
        int k = lists.size();
        for(int i = 0; i < k; i++){
            if(lists[i] != NULL)
                heap.push(lists[i]);
        }
        while(!heap.empty()){
            ListNode *tmp = heap.top();
            heap.pop();
            if(tmp -> next != NULL)
                heap.push(tmp -> next);
            cur -> next = tmp;
            cur = tmp;
        }
        return merge_list -> next;
    }
};
上一篇 下一篇

猜你喜欢

热点阅读