Leetcode215. 数组中的第K个最大元素

141 阅读1分钟

要求:

在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。

示例:

输入: [3,2,1,5,6,4] 和 k = 2
输出: 5 [1,2,3,4,5,6]

输入: [3,2,3,1,2,4,5,5,6] 和 k = 4
输出: 4 [1,2,2,3,3,4,5,5,6]

思路:

  1. 设置一个长度为K的优先队列,按从小到大排序,栈顶元素为队列中最小值。
  2. 对于数组的前K个元素,直接入队列。
  3. 以后每入一个新元素,都与顶部元素比较,但是仅是获取顶部元素与之比较,如果新元素比顶部元素大,就弹出顶部元素,新元素入队列,自动排序。
  4. 最后全部入队后,直接弹出队首元素即可。

代码:

class Sloution {
    public int findKthLargest(int[] nums, int k) {
        PriorityQueue<Integer> queue = new PriorityQueue<>(k, new Comparator<Integer>(){
            @Override
            public int compare(Integer o1, Integer o2) {
                return o1-o2;
            }
        });
        for (int i = 0; i < k; i++) {
            queue.add(nums[i]);
        }
        for (int i = k; i < nums.length; i++) {
            Integer temp = queue.peek();
            if (nums[i] > temp) {
                queue.poll();
                queue.add(nums[i]);
            }
        }
        return queue.poll();
    }
}