最小的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;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值