最小的K个数(18)

题目

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


方法1 :排序法
直接对数组进行排序,然后前k个值就是满足要求的。但是该方法,在数据很多时,效率低。
代码:

class Solution {
public:
    vector<int> res;
    vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
        res.clear();
        if(input.empty() || input.size()<k)
        {
            return res;
        }
        sort(input.begin(),input.end());
        for(int i=0;i<k;++i)
        {
            res.push_back(input[i]);
        }
        
        return res;
    }
};

方法二:最大堆
1、分析:
首先建立一个容器可以放下k个元素,首先将输入的前k个值存入该容器中。然后再将k+1之后的元素分别与容器内的元素进行比较。若大于容器内最大的值,则该输入被舍弃;若小于容器内的最大值,则将其与容器中的最大值进行调换。
该方法不需要一次将所有的数据都加载进内存中,对于海量的输入数据来说,具有很大的优势。
2、代码:

class Solution {
public:
    vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
        int len=input.size();
        // 注意处理意外情况
        if(len<=0 || k<=0 ||k>len)
            return vector<int>();
        //将input容器中的前k个元素存入一个新容器中
        vector<int> res(input.begin(),input.begin()+k);
        //创建堆
        make_heap(res.begin(),res.end());
        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;
    }
};
发布了213 篇原创文章 · 获赞 48 · 访问量 11万+

猜你喜欢

转载自blog.csdn.net/Jeffxu_lib/article/details/104688539