剑指offer-面试题40-最小的k个数-最大堆

/*
题目:
	输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。
*/
/*
思路:
	利用最大堆,C++中使用multiset<int,greater<int>>。
	当multiset中的值的个数小于K,则insert。
	当大于等于k时,判断multiset的最大值是否大于当前遍历值,若大于则覆盖。
*/
#include<iostream>
#include<string.h>
#include<stdio.h>
#include<set>
#include<vector>

using namespace std;



vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
    multiset<int,greater<int>> outSet;
    multiset<int,greater<int>>::iterator iter;
    vector<int> out;
    int len = input.size();
    if(k > len || k <= 0) return out;

    for(int i = 0; i < len; i++){
        if(outSet.size() < k){
            outSet.insert(input[i]);
        }else{
            iter = outSet.begin();
            if(*iter > input[i]){
                outSet.erase(iter);
                outSet.insert(input[i]);
            }
        }
    }
    for(iter = outSet.begin(); iter != outSet.end(); iter++){
        out.push_back(*iter);
    }
    return out;


}

int main(){
    vector<int> in = {};
    vector<int> out = GetLeastNumbers_Solution(in,10);
    for(int i = 0; i < out.size(); i++){
        cout<<out[i]<<" ";
    }

}

   

原文地址:https://www.cnblogs.com/buaaZhhx/p/11979756.html