最小的K个数

来源:互联网 发布:淘宝虚假交易处罚规则 编辑:程序博客网 时间:2024/06/11 15:43

题目描述

输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。

算法1:
partition方法,找到index = k+1位置的数字,那么前边的数字为所求。

算法2:
海量数据处理算法,维护一个k的最大堆,从头遍历数组,如果数字小于堆中最大值,则删除堆顶然后insert新值。

STL :
multiset是由红黑树底层实现,红黑树是BST,最懂排序:
multiset

class Solution {public:    vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {        vector<int> res;        if(input.size() == 0||k > input.size() || k < 1)            return res;        //构造大顶堆,和大顶堆指针        multiset<int,greater<int>> mt;        multiset<int,greater<int>> ::iterator it;        //遍历n数组,如果mt中没有k个数直接插入;如果mt中已经满了,则比较堆顶和新元素大小.        for (int i = 0; i < input.size(); ++i) {            if(mt.size() < k)                mt.insert(input[i]);            else{                it = mt.begin();                if(input[i] < *it){                    mt.erase(it);                    mt.insert(input[i]);                }            }        }        //将mt中元素导入vector        it = mt.end();        it--;        for (; it != mt.begin() ; --it) {            res.push_back(*it);        }        it = mt.begin();        res.push_back(*it);        return res;    }};
0 0
原创粉丝点击