最小的k个数

最小的K个数

http://www.nowcoder.com/questionTerminal/6a296eb82cf844ca8539b57c23e6e9bf

1.直接使用sort()函数

class Solution {
public:
    vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
        vector<int>ret;
        if(k==0||k>input.size())
            return ret;
        sort(input.begin(),input.end());
        return vector<int>({input.begin(),input.begin()+k});
    }
};

2.快排

class Solution {
public:
    vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
        if(k==0||k>input.size())
            return {};
        vector<int>ret;
        int l=0,r=input.size();
        while(l<r){
            int mid=partition(input,l,r);
            if(mid+1==k)
                return vector<int>({input.begin(),input.begin()+k});
            else if(mid+1<k)
                l=mid+1;
            else
                r=mid;
        }
        return ret;
    }
    int partition(vector<int> &input,int l,int r){
        int povit=input[r-1];
        int tmp=l;
        for(int i=l;i<r-1;i++){
            if(input[i]<povit){
                swap(input[tmp++],input[i]);
            }
        }
        swap(input[r-1],input[tmp]);
        return tmp;
    }
};

3.堆排

class Solution {
public:
    vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
        vector<int>ret;
        if(k==0||k>input.size())
            return ret;
        priority_queue<int,vector<int>>maxk;
        for(int i=0;i<input.size();i++){
            if(maxk.size()<k){
                maxk.push(input[i]);
            }
            else{
                if(input[i]<maxk.top()){
                    maxk.pop();
                    maxk.push(input[i]);
                }
            }
        }
        while(!maxk.empty()){
            ret.push_back(maxk.top());
            maxk.pop();
        }
        return ret;
    }
};

4.归并排序,但注意:归并排序需要对原始数组进行更新

class Solution {
public:
    vector<int>ret;
    vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
        if(k==0||k>input.size())
            return {};
        ret.resize(input.size());
        mergesort(input,0,input.size()-1);
        return vector<int>({ret.begin(),ret.begin()+k});
    }
    void mergesort(vector<int>& input,int l,int r){
        if(l>=r)
            return;
        int mid=(r+l)/2;
        mergesort(input,l,mid);
        mergesort(input,mid+1,r);
        Merge(input,l,mid,r);
    }
    void Merge(vector<int>& input,int l,int mid,int r){
        int i=l,j=mid+1;
        int k=l;
        while(i<=mid&&j<=r){
            if(input[i]<input[j]){
                ret[k++]=input[i++];
            }
            else
                ret[k++]=input[j++];
        }
        while(i<=mid)
            ret[k++]=input[i++];
        while(j<=r)
            ret[k++]=input[j++];
        //很重要,归并排序需要对原始数组进行更新
        for(int i=l;i<=r;i++){
            input[i]=ret[i];
        }
    }
};
全部评论

相关推荐

小红书 后端选手 n*16*1.18+签字费期权
点赞 评论 收藏
分享
像好涩一样好学:这公司我也拿过 基本明确周六加班 工资还凑活 另外下次镜头往上点儿
点赞 评论 收藏
分享
ProMonkey2024:5个oc?厉害! 但是有一个小问题:谁问你了?😡我的意思是,谁在意?我告诉你,根本没人问你,在我们之中0人问了你,我把所有问你的人都请来 party 了,到场人数是0个人,誰问你了?WHO ASKED?谁问汝矣?誰があなたに聞きましたか?누가 물어봤어?我爬上了珠穆朗玛峰也没找到谁问你了,我刚刚潜入了世界上最大的射电望远镜也没开到那个问你的人的盒,在找到谁问你之前我连癌症的解药都发明了出来,我开了最大距离渲染也没找到谁问你了我活在这个被辐射蹂躏了多年的破碎世界的坟墓里目睹全球核战争把人类文明毁灭也没见到谁问你了(别的帖子偷来的,现学现卖😋)
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务