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

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

  • 原题链接:
  • 完成情况:
  • 解题思路:
  • 参考代码:

原题链接:

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

https://leetcode.cn/problems/kth-largest-element-in-an-array/submissions/

完成情况:

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

解题思路:

PriorityQueue?

PriorityQueue 是 Java 中的一个实现了优先级队列的类。它是一个基于优先级堆的数据结构,用于存储一组元素,并根据它们的优先级进行排序。优先级最高的元素将排在队列的前面,当使用 poll()remove() 方法移除元素时,总是会先移除优先级最高的元素。

在 Java 中,PriorityQueue 有以下一些重要的方法:

  1. add(E element)offer(E element): 向优先级队列中添加一个元素。
  2. poll(): 移除并返回优先级最高的元素。
  3. peek(): 返回但不移除优先级最高的元素。
  4. remove(Object o): 从队列中移除指定的元素。
  5. isEmpty(): 检查队列是否为空。
  6. size(): 返回队列中元素的个数。

注意:默认情况下,PriorityQueue 会根据元素的自然顺序进行排序,即元素必须实现 Comparable 接口。如果希望使用自定义排序,可以在创建 PriorityQueue 时提供一个实现了 Comparator 接口的比较器。

以下是一个示例代码,展示如何使用 PriorityQueue

import java.util.PriorityQueue;

public class PriorityQueueExample {
    public static void main(String[] args) {
        // 创建一个优先级队列
        PriorityQueue<Integer> pq = new PriorityQueue<>();

        // 添加元素
        pq.add(5);
        pq.add(2);
        pq.add(8);
        pq.add(1);
        pq.add(3);

        // 移除并输出元素,会按照优先级从小到大输出
        while (!pq.isEmpty()) {
            System.out.print(pq.poll() + " ");
        }
        // 输出: 1 2 3 5 8
    }
}

在上面的示例中,我们创建了一个 PriorityQueue 存储整数,并且元素将按照从小到大的顺序进行输出。

Comparator.comparingInt(a -> a)的含义

Comparator.comparingInt(a -> a) 是一个使用 Java 8 中的 Comparator 接口提供的静态方法来创建一个比较器(Comparator)的例子。它用于比较整数类型的元素。

这个比较器的含义是:基于元素本身的整数值进行比较。实际上,它等效于使用自然顺序进行比较。整数的自然顺序是由它们的数值大小决定的。

更详细地说,Comparator.comparingInt(a -> a) 执行以下操作:

  1. 对于给定的元素 a,它会提取 a 的整数值作为比较的依据。
  2. 然后,使用这些整数值进行比较。

这个比较器适用于具有整数值的对象,例如 Integer 类型或具有整数属性的自定义类。

以下是一个使用 Comparator.comparingInt(a -> a) 的示例:

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;

public class Example {
    public static void main(String[] args) {
        List<Integer> numbers = new ArrayList<>();
        numbers.add(5);
        numbers.add(2);
        numbers.add(8);
        numbers.add(1);
        numbers.add(3);

        // 使用 Comparator.comparingInt(a -> a) 对整数进行排序
        numbers.sort(Comparator.comparingInt(a -> a));

        // 输出排序后的结果
        for (Integer num : numbers) {
            System.out.print(num + " ");
        }
        // 输出: 1 2 3 5 8
    }
}

在上面的示例中,我们创建了一个包含整数的列表 numbers,然后使用 Comparator.comparingInt(a -> a) 对整数进行排序,最终输出排序后的结果。由于使用了这个比较器,列表 numbers 中的整数会按照从小到大的顺序输出。

参考代码:

package 中等题;

import java.util.Comparator;
import java.util.PriorityQueue;

public class __215数组中的第K个最大元素__优先队列 {
   //维护一个有 K 个元素的最小堆
   public int findKthLargest(int[] nums, int k) {
       int len = nums.length;
       //使用一个含有 k 个元素的最小堆,PriorityQueue 底层是动态数组,为了防止数组扩容产生消耗,可以先指定数组的长度
       /**
        *   PriorityQueue?
        *   Comparator.comparingInt(a -> a)的含义
        *
        */
       PriorityQueue<Integer> minHeap = new PriorityQueue<>(k, Comparator.comparingInt(a -> a));
       for (int i=0;i<k;i++){       //开局先直接放k个进去
           minHeap.offer(nums[i]);
       }

       for (int i=k;i<len;i++){     //从第K+1个开始进行操作
           Integer topElement = minHeap.peek();
           //只要当前遍历的元素比堆顶元素大,队顶弹出,遍历的元素进去
           if (nums[i] > topElement){
               minHeap.poll();
               minHeap.offer(nums[i]);
           }
       }
       return minHeap.peek();
   }

}

你可能感兴趣的:(#,LeetCode题解,算法知识,leetcode,算法,数据结构)