欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

在未排序的数组中找到第 k 个最大的元素

程序员文章站 2024-03-15 22:17:24
...

:在未排序的数组中找到第 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
//方法一:使用Arrays工具类
public static int findKthLargest1(int nums[], int k) {
    //1.排序
    Arrays.sort(nums);
    //2.返回第k个最大的元素
    return nums[nums.length - k];
}

//方法二:计数排序
public static int findKthLargest2(int nums[], int k) {
    if (nums == null || nums.length == 0) {
        return -1;
    }
    //1.找到最大最小值
    int max = nums[0];
    int min = nums[0];
    for (int i = 1; i < nums.length; i++) {
        max = max > nums[i] ? max : nums[i];
        min = min < nums[i] ? min : nums[i];
    }
    //2.创建没有重复元素的数组
    int[] output = new int[max - min + 1];
    //计算重复个数
    for (int i = 0; i < nums.length; i++) {
        output[nums[i] - min]++;
    }
    //3.计数
    int count = 0;
    for (int i = output.length - 1; i >= 0; i--) {
        count += output[i];
        if (count >= k) {
            return i + min;
        }
    }
    return -1;
}

//3.优先队列
public static int findKthLargest3(int nums[], int k) {
    PriorityQueue<Integer> heap = new PriorityQueue<>();
    for (int num : nums){
        if (heap.size()<k){
            heap.add(num);
        }else if (heap.peek() < num){
            heap.poll();
            heap.add(num);
        }
    }
    return heap.poll();


}
相关标签: java leetcode

上一篇: Unity武器与子弹碰撞检测

下一篇: