剑指Offer-第17天 排序(中等)

第一题

题目链接:https://leetcode.cn/problems/zui-xiao-de-kge-shu-lcof/

个人题解:设置优先队列,存入 \(k\) 个值,然后弹出即可

代码:

class Solution {
public:
    vector<int> getLeastNumbers(vector<int>& arr, int k) {
        vector<int> res;
        priority_queue<int> heap;
        for(auto x:arr){
            heap.push(x);
            if(heap.size()>k) heap.pop(); 
        }
        while(heap.size()){
            res.push_back(heap.top());
            heap.pop();
        }
        reverse(res.begin(),res.end());
        return res;
    }
};

运行截图:

image

第二题

题目链接:https://leetcode.cn/problems/shu-ju-liu-zhong-de-zhong-wei-shu-lcof/

个人题解:用两个优先队列

  1. 一个小根堆来维护最大值,一个大根堆来维护最小值
  2. 如果大根堆小,中位数就是队首元素,否则就是两个堆队首元素之和
  3. 插入数字的时候,比较两个队列的队首即可。

代码:

class MedianFinder {
public:
    priority_queue<int,vector<int>,less<int>> q1;
    priority_queue<int,vector<int>,greater<int>> q2;
 
    /** initialize your data structure here. */
    MedianFinder() {

    }
    
    void addNum(int num) {
        if(q1.empty() || num<=q1.top()){
            q1.push(num);
            if(q2.size()+1<q1.size()){
                q2.push(q1.top());
                q1.pop();
            }
        }
        else{
            q2.push(num);
            if(q2.size()>q1.size()){
                q1.push(q2.top());
                q2.pop();
            }
        }
    }
    
    double findMedian() {
        int n=q1.size(),m=q2.size();
        if(n>m) return q1.top();
        return (q1.top()+q2.top())/2.0;
    }
};

运行截图:

image

posted @ 2022-05-19 17:03  黑VS白-清墨  阅读(17)  评论(0)    收藏  举报