码迷,mamicode.com
首页 > 其他好文 > 详细

剑指offer-最小的k个数

时间:2019-06-13 22:23:40      阅读:145      评论:0      收藏:0      [点我收藏+]

标签:空间   剑指offer   个数   nbsp   inpu   turn   top   null   描述   

题目描述

输入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   个数   nbsp   inpu   turn   top   null   描述   

原文地址:https://www.cnblogs.com/zhacai/p/11019690.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!