forked from haobinaa/DataStructure-DesignPattern
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathFindKthLargest.java
61 lines (57 loc) · 2.11 KB
/
FindKthLargest.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
package com.haobin.leetcode.arrays;
import java.util.Arrays;
import java.util.PriorityQueue;
/**
* @Author HaoBin
* @Create 2020/2/7 12:38
* @Description: 寻找第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
* 说明:
*
* 你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度。
**/
public class FindKthLargest {
/**
* 暴力解法, 排序后取倒数第K个
*/
public int findKthLargest1(int[] nums, int k) {
Arrays.sort(nums);
return nums[nums.length-1-k];
}
/**
* 优先队列
* 因为第 K 大元素,其实就是整个数组排序以后后半部分最小的那个元素。因此,我们可以维护一个有 K 个元素的最小堆:
* 1. 如果当前堆不满,直接添加
* 2. 堆满的时候,如果新读到的数小于等于堆顶,肯定不是我们要找的元素,只有新都到的数大于堆顶的时候,
* 才将堆顶拿出,然后放入新读到的数,进而让堆自己去调整内部结构
*
*
* 思路1:把 len 个元素都放入一个最小堆中,然后再 pop() 出 len - k 个元素,此时最小堆只剩下 k 个元素,堆顶元素就是数组中的第 k 个最大元素。
*
* 思路2:把 len 个元素都放入一个最大堆中,然后再 pop() 出 k - 1 个元素,因为前 k - 1 大的元素都被弹出了,此时最大堆的堆顶元素就是数组中的第 k 个最大元素。
*
*/
public int findKthLargest(int[] nums, int k) {
int len = nums.length;
PriorityQueue<Integer> minHeap = new PriorityQueue<>(len, (a, b) -> {
return a-b;
});
for (int i = 0; i < len; i++) {
minHeap.add(nums[i]);
}
for (int i = 0; i < len-k; i++) {
minHeap.poll();
}
return minHeap.peek();
}
}