【剑指Offer】最小的K个数

题目描述
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。
方法1:堆排序

class Solution {
public:

    void HeapAdjust(vector<int> &input,int s,int n){
        int l=s*2+1;
        while(l<n){
            if(l+1<n&&input[l+1]<input[l]){
                l++;
            }
            if(input[l]<input[s]){
                swap(input[s],input[l]);
                s=l;
                l=s*2+1;
            }else{
                break;
            }
        }
    }
    void BuildHeap(vector<int> &input,int n){
        for(int i=(n-1)/2;i>=0;i--){
             HeapAdjust(input,i,n);
        }
    }
    vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
        int n=input.size();
        BuildHeap(input,n);
        vector<int> ans;
        if(n<=0||k<=0||k<n)return ans;
        for(int i=0;i<k;i++){
            ans.push_back(input[0]);
            swap(input[0],input[n-1-i]);
            HeapAdjust(input,0,n-1-i);
        }
        return ans;
    }
};

方法2:基于快速排序

 int Partition(vector<int> &a,int l,int r){
        int i=l;
        for(int j=l;j<r;j++){
            if(a[j]<a[r]){
                swap(a[i++],a[j]);
            }
        }
        swap(a[i],a[r]);
        return i;
    }

    vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
        int n=input.size();
         //k>n这个条件一定要加,不然就是数组越界
        if(n<=0||k<=0||k>n)return  vector<int>(); 
        if(k==n) return input; 
        int l=0,r=n-1;
        int index=Partition(input,l,r);
        while(index!=k){
            if(index>k){
                r=index-1;
                index=Partition(input,l,r);
            }
            if(index<k){
                l=index+1;
                index=Partition(input,l,r);
            }
        }
        vector<int> ans(input.begin(),input.begin()+k);
        return ans;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值