剑指offer的最小k个数

来源:互联网 发布:广东飞鱼网络 编辑:程序博客网 时间:2024/06/05 18:02

题目描述

输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,
链接:
https://www.nowcoder.com/practice/6a296eb82cf844ca8539b57c23e6e9bf?tpId=13&tqId=11182&tPage=2&rp=2&ru=%2Fta%2Fcoding-interviews&qru=%2Fta%2Fcoding-interviews%2Fquestion-ranking
第一种方法(排序):
思路:刚看到这题,第一想法就是sort排序,时间复杂度为NlogN,然后将前k个数存储进去,写了下居然通过了,没超时。。
代码很简单:
classSolution {
public:
    vector<int> GetLeastNumbers_Solution(vector<int> input, intk) { 
        vector<int> v;
        if(k>input.size())
            returnv;
        sort(input.begin(),input.end());
        for(inti=0;i<k;i++)
            v.push_back(input[i]);
        returnv;     
    }
}
第二种方法(partial__sort):
思路:先将前k个数按照heap_sort(heap_sort就不介绍了,课自行百度)排好,然后(前k个中最大的数)第一个数和第k+1个数比较,如果第一个数比第k+1个大,交换两个数的位置,然后heap_sort继续将k个数中最大数放到第一个位置,继续和第k+1个数比较,如果第一个数不大于第k+1个数,则与第k+2个比较,知道容器最后一个数,结束。
AC代码:
class Solution {
public:
    vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
        vector<int>res;
        if(k>input.size()||input.empty())return res;
        for(int i=input.size()/2;i>=0;--i)
            partial_sort(input,i,k);
        int i=k;
        while(i<input.size()){
            if(input[i]<input[0]){
                int tmp=input[0];
                input[0]=input[i];
                input[i]=tmp;
                partial_sort(input,0,k);
                i=k;
            }else i++;
        }
        for(int i=0;i<k;++i)
            res.push_back(input[i]);
        return res;
    }
    void partial_sort(vector<int>&input,int i,int len){
        int child=2*i+1;
        if(child<len){
            if(child+1<len&&input[child+1]>input[child])
                child+=1;
            if(input[child]>input[i]){
                int tmp=input[child];
                input[child]=input[i];
                input[i]=tmp;
                partial_sort(input,child,len);
            }
        }
    }
};
原创粉丝点击