剑指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;
     }
};

你可能感兴趣的:(剑指offer29 ——最小K个数题解)