【剑指offer-解题系列(30)】最小的K个数

来源:互联网 发布:房地产数据网 编辑:程序博客网 时间:2024/05/19 01:12

题目描述

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

分析

要找出前k个最大数,简单的方法就是快排,然后把前k个输出。

另外就是堆排序,最小堆直接把前k个最小的值输出。

(另外有一种所谓大数据的k个最小数的情况,这种方法就是先找出k个最小数,然后形成最大堆,每次来一个新数先和最大堆顶元素比较,就可以动态维护最小的k个数)

代码实现

    void qsort(vector<int>&a ,int start,int end){
        if(start>=end)
            return;
        
        int value = a[end];
        int ind = start ;
        for(int i = start ;i< end;i++){
            if(a[i]<value){
                swap(a[ind++],a[i]);
            }
        }
        swap(a[ind],a[end]);
        
        qsort(a , start,ind-1);
        qsort(a , ind+1,end);
    }
    
    
    
    
    
    void HeapAdjust(vector<int>&a ,int start,int end){
        for(int i = end ;i>=start;i--){////一定是从后往前
            int left = 2*i+1;
            int right = 2*i+2;
            if( left <= end){
                if(right>end){
                    if(a[i]>a[left])
                        swap(a[i],a[left]);
                }
                else if(a[i]>=a[left] && a[right]>=a[left]){
                    swap(a[i],a[left]);
                }
                else if(a[i]>=a[right] && a[left]>=a[right]){
                    swap(a[i],a[right]);
                }
            }
        }
    }
    
    void HeapSort(vector<int>&a ,int start,int end){
        for(int i = end;i>=start;i--){
            HeapAdjust( a ,  start,  i);
            swap(a[i],a[start]);
        }
    }
    
    
    
    
    
    vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
       
        vector<int>res;
        
        if(k>input.size()){
            return res;
        }
        int ind = input.size()-1;
        for(int i =0;i<k;i++){
            HeapAdjust( input ,0,ind );
            swap(input[0],input[ind]);
            res.push_back(input[ind]);
            ind--;
        }
        return res;
    }
    
    
    vector<int> GetLeastNumbers_Solution2(vector<int> input, int k) {
        HeapSort( input ,0,input.size()-1);
        vector<int>res;
        
        if(k>input.size()){
            return res;
        }
        for(int i =0;i<k;i++){
            res.push_back(input[i]);
        }
        return res;
    }


原创粉丝点击