最小的k个数

来源:互联网 发布:淘宝企业店铺装修教程 编辑:程序博客网 时间:2024/05/29 08:47

题目描述

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

/*方法一:库函数sort排序,内部综合了多种排序方法,时间复杂度为nlogn*/class Solution {public:    vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {        vector<int> res;        if(k<0||k>input.size()) return res;        sort(input.begin(),input.end());        for(int i=0; i<k; ++i)            res.push_back(input[i]);        return res;    }};/*方法二:partition思想,即快速排序方法,第一次为n,第二次为2/n,往后为3/n,4/n...,求和得时间复杂度为2n,即O(N)的复杂度*//*此处的前k个数字并未排序,若要排序输出,则要进行完整的快速排序或者对前k个数排个序*/class Solution {public:    int Partition(vector<int>& input, int begin, int end)    {        int low=begin;        int high=end;                 int pivot=input[low];        while(low<high)        {            while(low<high&&pivot<=input[high])                high--;            input[low]=input[high];            while(low<high&&pivot>=input[low])                low++;            input[high]=input[low];        }        input[low]=pivot;        return low;    }         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;                 int start=0;        int end=len-1;        int index=Partition(input,start,end);        while(index!=(k-1))        {            if(index>k-1)            {                end=index-1;                index=Partition(input,start,end);            }            else            {                start=index+1;                index=Partition(input,start,end);            }        }        for(int i=0; i<k; ++i)            res.push_back(input[i]);                 return res;    } };/*方法三:构建最大堆,时间复杂度为nlogk*/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());        for(int i=k; i<len; ++i)            {            if(res[0]>input[i])                {                pop_heap(res.begin(),res.end());                res.pop_back();                res.push_back(input[i]);                push_heap(res.begin(),res.end());            }        }        return res;    }};/*方法四:multiset存储,底层红黑树实现,时间复杂度为nlongk*/class Solution {public:    vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {        int len=input.size();        if(len<=0||k>len) return vector<int>();                 //仿函数中的greater<T>模板,从大到小排序        multiset<int, greater<int> > leastNums;        vector<int>::iterator vec_it=input.begin();        for(;vec_it!=input.end();vec_it++)        {            //将前k个元素插入集合            if(leastNums.size()<k)                leastNums.insert(*vec_it);            else            {                //第一个元素是最大值                multiset<int, greater<int> >::iterator greatest_it=leastNums.begin();                //如果后续元素<第一个元素,删除第一个,加入当前元素                if(*vec_it<*(leastNums.begin()))                {                    leastNums.erase(greatest_it);                    leastNums.insert(*vec_it);                }            }        }                 return vector<int>(leastNums.begin(),leastNums.end());    }};




原创粉丝点击