大小堆

93 阅读1分钟
  1. 给定一个包含n个整数的数组nums,找到数组中第k个最大元素。例如,给定数组[3,2,1,5,6,4]和k = 2,函数应该返回5。
public int findKthLargest(int[] nums, int k) {
    PriorityQueue<Integer> heap = new PriorityQueue<>(); // 创建小根堆
    for (int num : nums) {
        heap.offer(num); // 将元素加入小根堆
        if (heap.size() > k) {
            heap.poll(); // 如果小根堆的大小超过了 k,则弹出堆顶元素
        }
    }
    return heap.peek(); // 返回堆顶元素
}

注释中解释了每个部分的作用:

  • 创建一个小根堆 heap。
  • 遍历整个数组,将每个元素加入小根堆中。
  • 如果小根堆的大小大于 k,则弹出堆顶元素,保证堆的大小为 k。
  • 最后,返回小根堆的堆顶元素,即第 k 大的元素。
public int findKthLargest(int[] nums, int k) {
    PriorityQueue<Integer> heap = new PriorityQueue<>(Collections.reverseOrder()); // 创建大根堆
    for (int num : nums) {
        heap.offer(num); // 将元素加入大根堆
    }
    int result = 0;
    while (k > 0) {
        result = heap.poll(); // 弹出堆顶元素
        k--; // k 减 1
    }
    return result; // 返回第 k 大的元素
}

注释中解释了每个部分的作用:

  • 创建一个大根堆 heap。
  • 遍历整个数组,将每个元素加入大根堆中。
  • 弹出大根堆的堆顶元素 k 次,得到第 k 大的元素。
  • 返回第 k 大的元素。