题解 | #最小的K个数#

最小的K个数

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

import java.util.ArrayList;

public class Solution {
    /**
    堆排序
    */
    public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
        ArrayList<Integer> ret = new ArrayList<>() ;
        if(input == null || input.length == 0 || k == 0 || k > input.length) {
            return ret ;
        }
        //创建小顶堆
        for(int i = (input.length-2)/2 ; i >= 0 ; i --) {
            heapify(input,input.length,i) ;
        }
        //开始交换
        for(int j = input.length-1,q = 1 ; j >= 0 && q <= k ;q++, j --) {
            swap(input , 0 , j) ;
            ret.add(input[j]) ;
            heapify(input , j , 0) ;
        }
        return ret ;
    }
    /**
    调整堆:len表示调整的堆对应的数组的长度 , i表示调整哪一个结点(默认该节点的子节点们已经是堆了)
    */
    public void heapify(int[] arr , int len ,int i) {
        if(i >= len) {
            return  ;
        }
        int l = i * 2 + 1 ;
        int r = i * 2 + 2 ;
        int minIndex = i ;
        if(l < len && arr[minIndex] > arr[l]) {
            minIndex = l ;
        }
        if(r < len && arr[minIndex] > arr[r]) {
            minIndex = r ;
        }
        if(minIndex != i) {
            swap(arr , i , minIndex) ;
            heapify(arr,len , minIndex) ;
        }
    }
    public void swap(int []arr , int i , int j) {
        int temp = arr[i] ;
        arr[i] = arr[j] ;
        arr[j] = temp ;
    }
}

一个菜鸟的算法刷题记录 文章被收录于专栏

分享一个菜鸟的成长记录

全部评论

相关推荐

蚂蚁 基架java (n+6)*16 签字费若干
点赞 评论 收藏
分享
沉淀一会:1.同学你面试评价不错,概率很大,请耐心等待; 2.你的排名比较靠前,不要担心,耐心等待; 3.问题不大,正在审批,不要着急签其他公司,等等我们! 4.预计9月中下旬,安心过节; 5.下周会有结果,请耐心等待下; 6.可能国庆节前后,一有结果我马上通知你; 7.预计10月中旬,再坚持一下; 8.正在走流程,就这两天了; 9.同学,结果我也不知道,你如果查到了也告诉我一声; 10.同学你出线不明朗,建议签其他公司保底! 11.同学你找了哪些公司,我也在找工作。
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务