剑指offer29 ——最小K个数题解

剑指offer29 ——最小K个数题解

剑指offer29题:输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。
解法一:最简单的解法,先排序,再选前k个。
ps:sort排序使用的是改进的快排,数据量大时采用QuickSort快排算法,分段归并排序。一旦分段后的数据量小于某个门槛(16),为避免QuickSort快排的递归调用带来过大的额外负荷,就改用Insertion Sort插入排序。如果递归层次过深,还会改用HeapSort堆排序。

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

方法二:使用堆排序比快排最坏的时间复杂度n方要快

class Solution {
public:
    vector<int> GetLeastNumbers_Solution(vector<int> input, int k){    //堆排序
         if(k>input.size())
         {
             return {};
         }
         vector<int> result(input.begin(),input.begin()+k);
         make_heap(result.begin(),result.end());	//建立最大堆
         for(int i=k;i<input.size();i++)
         {
             if(result[0]>input[i])
             {
                 pop_heap(result.begin(),result.end());	//把最大值移到最后一个元素
                 result.pop_back(); //移除最后一个元素
                 result.push_back(input[i]);
                 push_heap(result.begin(),result.end()); //重新选出最大值
             }
         }
         sort_heap(result.begin(),result.end());
         return result;
     }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值