题解 | #最小的K个数#

最小的K个数

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

构建小根堆,然后取 k 次根,每次取完后再堆化

import java.util.ArrayList;

public class Solution {
    public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
        ArrayList<Integer> res = new ArrayList<>();
        buildHead(input,input.length);
        for (int i = 1; i <= k; i++) {
            res.add(input[0]);
            swap(input,0,input.length-i);
            heapify(input,0,input.length-i);
        }
        return res;
    }

    // 建堆
    public void buildHead(int[] arr,int n) {
        for (int i = (n/2)-1; i >=0; i--) {
            heapify(arr,i,n);
        }
    }

    // 堆化
    public void heapify(int[] arr,int i,int n) {
        while (i*2+1<n) {
            int child = i * 2 + 1;
            if (child+1<n && arr[child+1]<arr[child]) child++;
            // 说明堆化完成了,不用再进行了
            if (!(arr[child] <arr[i])) return;
            swap(arr,i,child);
            i=child;
        }
    }

    public void swap(int[] arr,int x,int y) {
        int tmp = arr[x];
        arr[x]=arr[y];
        arr[y]=tmp;
    }
}
全部评论

相关推荐

头像
03-18 09:09
Java
点赞 评论 收藏
转发
点赞 收藏 评论
分享
牛客网
牛客企业服务