题解 | 最小的K个数

最小的K个数

https://www.nowcoder.com/practice/6a296eb82cf844ca8539b57c23e6e9bf

#include <vector>
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param input int整型vector 
     * @param k int整型 
     * @return int整型vector
     */
    
    vector<int> GetLeastNumbers_Solution(vector<int>& input, int k) {
        vector<int> res;
        if(k==0||k>input.size())
        {
            return res;
        }
        priority_queue<int> pq;
        //采用遍历+最大堆的方式,默认前4个为堆里的成员,此时pq的top为当前4个数的最大值
        //假如数组往后移动一次,进来一个比当前4个数中最大数还要小的数,此时往前看
        //pq中的四个数,一定是这五个数中最小的四个数,同理,再往后移动一个,还是遇到比最大数
        //还要大的数就不push,比最大数要小的数再进来,所以此时pq中的四个数依旧是这六个数中
        //最小的四个数,以此类推,直到数组遍历完成
        //因为往后是遍历一个数并且pop是删一个数,所以这保证了我们只比较pq的top即可,因为只需要把
        //最大值这一个数替换掉,这4个数就是迄今为止见过的最小的4个数
        for(auto i:input)
        {
            if(pq.size()<k)
            {
                pq.push(i);
            }
            else 
            {
              if(i<pq.top())
              {
                 pq.pop();
                 pq.push(i);
              }
            }
        }
        while(!pq.empty())
        {
            res.push_back(pq.top());
            pq.pop();
        }
        return res;
        
    }
};

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务