剑指offer 编程题(28):最小的K个数

来源:互联网 发布:家庭相册制作软件 编辑:程序博客网 时间:2024/06/13 00:36

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

class Solution {public:    vector<int> GetLeastNumbers_Solution(vector<int> input, int k)    {        vector<int> res;        int sizein = input.size();        if(sizein <= 0 || k <= 0 || k > sizein)        {            return res;        }        sort(input.begin(),input.end());        res.assign(input.begin(),input.begin()+k);        return res;    }};
class Solution {public:    vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {        int len=input.size();        vector<int> res;        if(len<=0||k>len||k<=0) return res;        for(int i=0;i<k;++i)            res.push_back(input[i]);        make_heap(res.begin(),res.end());        //默认make_heap,最大的在开头,        for(int i=k;i<len;++i)        {            if(res.front() > input[i])                //开头最大元素大于新来的,就弹出开头,让新来的进去            {                pop_heap(res.begin(),res.end());                res.pop_back();                res.push_back(input[i]);                push_heap(res.begin(),res.end());                //重新堆排列            }        }        sort_heap(res.begin(),res.end());        return res;    }};
class Solution {    public:    vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {        int len=input.size();        vector<int> res;        if(len<=0||k>len||k<=0) return res;        for(int i=0;i<k;++i)            res.push_back(input[i]);       sort(res.begin(),res.end());        //默认对vector进行sort排序,最大的在末尾,从小到大        for(int i=k;i<len;++i)        {            if(res.back() > input[i])                //末尾是最大元素,末尾大于新来的,就弹出开头,让新来的进去            {                res.pop_back();                res.push_back(input[i]);                sort(res.begin(),res.end());                //重新堆排列            }        }        sort(res.begin(),res.end());        return res;    }};