题解 | #最小的K个数#

最小的K个数

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

import java.util.ArrayList;

public class Solution {
    public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
        // 堆排序可以找出前最小的k的数,最小堆
        return heapSort(input, k);
    }

    public ArrayList<Integer> heapSort(int[] arr, int k){
        ArrayList<Integer> list = new ArrayList<>();
         if(arr.length==0)
            return list;
        // 创建初始堆
        for(int i=(arr.length-1)/2;i>=0;i--){
            // 从第一个分支节点开始
            adjustHeap(arr,i, arr.length);
        }

        // 调整堆结构,交换前K个数
        for(int i=arr.length-1;i>arr.length-1-k;i--){
            int temp = arr[0];
            arr[0] = arr[i];
            arr[i] = temp;
            list.add(arr[i]);

            adjustHeap(arr, 0, i);
        }
        return list;
    }

    public void adjustHeap(int[] arr, int n, int length){
        int temp = arr[n];
        int lchild = 2 * n + 1; // 左孩子
        while(lchild < length){
            int rchild = lchild + 1; // 获取右孩子
            if(rchild < length && arr[lchild] > arr[rchild]){
                // 如果右孩子存在且左孩子大于右孩子
                lchild++;
            }
            // 如果父节点小于左右孩子中较小的那个,则跳过
            if(temp < arr[lchild]){
                break;
            }
            arr[n] = arr[lchild];
            arr[lchild] = temp;

            n = lchild;
            lchild = 2 * lchild + 1; // 交换了之后仍然要比较子节点
        }
    }
}
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务