📜  使用优先队列的未排序数组中的第 K 个最小元素(1)

📅  最后修改于: 2023-12-03 14:49:52.685000             🧑  作者: Mango

使用优先队列的未排序数组中的第 K 个最小元素

当需要在未排序的数组中查找第 K 个最小元素时,可以使用优先队列(堆)。

优先队列

优先队列是一种特殊的队列,其中每个元素都有一个与之相关的优先级。当需要从队列中弹出元素时,总是先弹出具有最高优先级的元素。在本例中,我们只需要弹出前 K 个最小元素,因此我们可以使用小根堆实现优先队列。

在Java中,我们可以使用PriorityQueue类来实现优先队列。默认情况下,PriorityQueue实现的是小根堆。

// 创建一个小根堆优先队列
PriorityQueue<Integer> pq = new PriorityQueue<>();
算法思路
  1. 遍历整个数组,将每个元素插入优先队列中。
  2. 如果优先队列中的元素数量超过了 K,就弹出队首元素。
  3. 最后队首元素即为未排序数组中的第 K 个最小元素。
代码实现
public int kthSmallest(int[] nums, int k) {
    PriorityQueue<Integer> pq = new PriorityQueue<>();
    for (int num : nums) {
        pq.offer(num);
        if (pq.size() > k) {
            pq.poll();
        }
    }
    return pq.peek();
}
时间复杂度

时间复杂度为$O(nlogk)$。

  • 插入每个元素的时间复杂度为$O(logk)$。
  • 最多可能需要弹出 $n-k$ 个元素,弹出一个元素的时间复杂度为$O(logk)$。
  • 因此,总时间复杂度为$O(nlogk)$。