LeetCode Hot100 215.数组中的第k个最大元素

题目

给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。

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

你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。

方法一:内部 api 排序

class Solution {
    public int findKthLargest(int[] nums, int k) {
        Arrays.sort(nums);
        int n = nums.length;
        return nums[n - k];
    }
}

LeetCode Hot100 215.数组中的第k个最大元素_第1张图片

方法二:堆排序

class Solution {
    public int findKthLargest(int[] nums, int k) {
        PriorityQueue heap = new PriorityQueue<>(); // 小顶堆
        for (int num : nums) {
            heap.offer(num);
            if (heap.size() > k)  // 让堆始终保持k个元素,多于k时让堆顶即最小的出
                heap.poll();  // 出堆顶,即最小的元素
        }
        return heap.peek();  // 返回堆顶元素
    }
}

小顶堆:每个节点的值都小于或等于其左右孩子的值

大顶堆:每个节点的值都大于或等于其左右孩子的值

LeetCode Hot100 215.数组中的第k个最大元素_第2张图片

LeetCode Hot100 215.数组中的第k个最大元素_第3张图片

你可能感兴趣的:(算法刷题-堆,leetcode,算法,数据结构)