剑指offer:最小的k个数(java)

import java.util.ArrayList;
import java.util.TreeSet;

/**
 * 题目:
 *      输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。
 *
 * 解题思路:
 *      可以先创建一个大小为k的数据容器来存储最小的k个数字,从输入的n个整数中一个一个读入放入该容器中,
 *      如果容器中的数字少于k个,按题目要求直接返回空;如果容器中已有k个数字,而数组中还有值未加入,
 *      此时就不能直接插入了,而需要替换容器中的值。按以下步骤进行插入:
 *         1)先找到容器中的最大值;
 *         2)将待查入值和最大值比较,如果待查入值大于容器中的最大值,则直接舍弃这个待查入值即可;
 *         3)如果待查入值小于容器中的最小值,则用这个待查入值替换掉容器中的最大值;
 *      重复上述步骤,容器中最后就是整个数组的最小k个数字。
 *      对于这个容器的实现,我们可以使用最大堆的数据结构,最大堆中,根节点的值大于它的子树中的任意节点值。
 *     Java中的TreeSet类实现了红黑树的功能,它底层是通过TreeMap实现的,TreeSet中的数据会按照插入数据自动升序排列(按自然顺序)。
 *     因此我们直接将数据依次放入到TreeSet中,数组就会自动排序。
 */
public class P209_GetLeastKNumbers {
    public ArrayList GetLeastKNumbers(int[] input, int k) {
        ArrayList result = new ArrayList<>();

        if (input == null || input.length == 0 || k == 0 || k > input.length) {

            return result;
        }

        TreeSet list = new TreeSet<>();

        for (int i = 0; i < input.length; i++) {
            list.add(input[i]);
        }

        for (Integer elem : list) {
            if (result.size() > k - 1) {
                break;
            } else result.add(elem);
        }
        return result;
    }

    public static void main(String[] args) {
        int[] array = {1, 5, 9, 3, 2, 7, 5, 6, 4};
        int k = 3;

        P209_GetLeastKNumbers test = new P209_GetLeastKNumbers();
        ArrayList result = new ArrayList<>();
        result = test.GetLeastKNumbers(array, k);
        System.out.print(result);
    }
}

你可能感兴趣的:(剑指offer:最小的k个数(java))