【LeetCode】数组中的第K个最大元素Java题解

175 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第35天,点击查看活动详情

题目描述

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

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

示例 1:

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

示例 2:

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

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/kth-largest-element-in-an-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路分析

  • 今天的算法题目是数组排序题目,求的是数组中第 k 个最大的元素。
  • 我们首先可以对数组整体排序,数组中第 n - k 个位置的元素即为答案。
  • 我们也可以使用堆数据结构实现这个算法。维护一个占用空间为 k 的优先队列。如果当前堆不满,直接添加。当堆长度为 k 的时候,则需要动态更新堆顶元素。占用的空间较小。
  • 在Java中,我们一般使用PriorityQueue,PriorityQueue默认是通过小顶堆来实现优先级队列的,也可以指定Comparator自定义实现队列的优先级。具体实现代码如下,供参考。

通过代码

class Solution {
    public int findKthLargest(int[] nums, int k) {
        int ans = 0;
        if (nums.length == 0) {
            return ans;
        }
        PriorityQueue<Integer> priorityQueue = new PriorityQueue<>(k);
        for (int num : nums) {
            if (priorityQueue.size() < k) {
                priorityQueue.add(num);
            } else {
                if (priorityQueue.peek() < num) {
                    priorityQueue.poll();
                    priorityQueue.add(num);
                }
            }
        }

        ans = priorityQueue.poll();
        return ans;
    }
}

总结

  • 系统函数排序,也就是快速排序的解法的时间复杂度是O(n log n), 空间复杂度是O(log n)
  • 优先队列解法的时间复杂度是O(n), 空间复杂度是O(n)
  • 在实际的考察中,我们除了会使用堆,还要学会简易版本的「建堆」、「调整」和「删除」的过程和代码,后面可以自己补充了解一下,夯实基础。
  • 坚持算法每日一题,加油!