《剑指offer第二版》面试题40:最小的k个数(java)

2020-01-05  本文已影响0人  castlet

题目描述

解题思路1

代码

List<Integer> getLeastNumbers(int[] arrs, int k) {
    if (arrs == null || arrs.length <= 0 || k <= 0 || k > arrs.length) {
        return new ArrayList<>();
    }

    int start = 0;
    int end  = arrs.length - 1;
    int middleIndex = partation(arrs, start, end);
    while (middleIndex != k - 1) {
        if (middleIndex < k - 1) {
            start = middleIndex + 1;
            middleIndex = partation(arrs, start, end);
        } else {
            end = end - 1;
            middleIndex = partation(arrs, start, end);
        }
    }
    List<Integer> result = new ArrayList<>();
    for (int i = 0; i < k; i ++) {
        result.add(arrs[i]);
    }
    return result;
}

解题思路2

  1. 创建一个容量为k的容器来保存最小的k个数字。
  2. 遍历数组,如果容器里的数字不到k个,则将数字放入容器中。
  3. 如果容器里的数字等于k个,则找出容器里的最大值,如果该值大于当前遍历的数字,则删除该最大值,将遍历的数字插入容器中。

代码

List<Integer> getLeastNumbers_v2(int[] arrs, int k) {
    if (arrs ==null || arrs.length <= 0 || k <= 0) {
        return new ArrayList<>();
    }
    // 构造优先队列,便于获取队列里的最大值
    Queue<Integer> queue = new PriorityQueue<>(k, new Comparator<Integer>() {
        @Override
        public int compare(Integer o1, Integer o2) {
            return o2.compareTo(o1);
        }
    });

    for (int i = 0; i < arrs.length; i++) {
        if (queue.size() < k) {
            // 队列容量未满
            queue.add(arrs[i]);
        } else {
            if (queue.peek() > arrs[i]) {
                // 替换队列里的最大值
                queue.poll();
                queue.add(arrs[i]);
            }
        }
    }

    return new ArrayList<>(queue);
}
上一篇 下一篇

猜你喜欢

热点阅读