剑指offer-最小的k个数

Posted zhacai

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指offer-最小的k个数相关的知识,希望对你有一定的参考价值。

题目描述

输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。
 
最下topk,使用大顶堆
    public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) 
        ArrayList<Integer> re = new ArrayList<Integer>();
        if(input == null || input.length<k ||k==0)//判断非法
            return re;
        
        int[] heap = new int[k];//new一个堆空间
        for(int i=0;i<k;i++)
            heap[i] = input[i];
        
        for(int i = k/2;i>=0;i--)//调整大顶堆
            adjustHeap(heap,i,k-1);
        
        for(int i = k;i<input.length;i++)//对第k个以后的数,如果小于堆顶元素就和堆顶替换,否则不进行任何操作
            if(input[i]<heap[0])
                heap[0] = input[i];
                adjustHeap(heap,0,k-1);
            
        
        for(int i = 0;i<k;i++)
            re.add(heap[i]);
        
        return re;
    
    public void adjustHeap(int[] heap,int left ,int right)//调整大顶堆
        int target = heap[left];
        for(int i=left*2+1;i<=right;i=i*2+1)
            if(i<right&&heap[i]<heap[i+1])
                i++;
            
            if(heap[i]<=target)
                break;
            
            heap[left] = heap[i];
            left =i;
        
        heap[left] =target;
    

 

以上是关于剑指offer-最小的k个数的主要内容,如果未能解决你的问题,请参考以下文章

剑指offer--40最小的k个数

剑指offer---最小的K个数

剑指 Offer 40. 最小的k个数

最小的K个数-剑指Offer

剑指offer:最小k个数

剑指 Offer 40. 最小的k个数