/* 题目: 输入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]<<" "; } }