-
Notifications
You must be signed in to change notification settings - Fork 46
/
Copy pathKthLargestElementInAnArray.java
155 lines (127 loc) · 4.01 KB
/
KthLargestElementInAnArray.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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
package LeetCodeJava.Array;
// https://leetcode.com/problems/kth-largest-element-in-an-array/
import java.util.*;
public class KthLargestElementInAnArray {
// V0
// IDEA : PQ (priority queue)
public int findKthLargest(int[] nums, int k) {
if (nums.length == 1){
if (k == 1){
return nums[0];
}
return -1; // ?
}
// init
// NOTE !!! init MAX PQ via Comparator.reverseOrder()
PriorityQueue<Integer> pq = new PriorityQueue<>(Comparator.reverseOrder());
for (int x : nums){
pq.add(x);
}
//System.out.println("pq = " + pq);
int cur = -1;
while (k > 0){
cur = pq.poll();
k -= 1;
}
return cur;
}
// V0
// IDEA : ARRAY + SORTING
public int findKthLargest_0_1(int[] nums, int k) {
if (nums.length == 1 && k == 1){
return nums[0];
}
Integer[] _nums = new Integer[nums.length];
for (int i = 0; i < nums.length; i++){
_nums[i] = nums[i];
}
// reverse sort
// https://stackoverflow.com/questions/1694751/java-array-sort-descending
Arrays.sort(_nums, Collections.reverseOrder());
for (int j = 0; j < _nums.length; j++){
int cur = _nums[j];
if (j == k-1){
return cur;
}
}
return -1;
}
// V1
// IDEA : SORT
// https://leetcode.com/problems/kth-largest-element-in-an-array/editorial/
public int findKthLargest_2(int[] nums, int k) {
Arrays.sort(nums);
// Can't sort int[] in descending order in Java;
// Sort ascending and then return the kth element from the end
return nums[nums.length - k];
}
// V2
// IDEA : Min-Heap
// https://leetcode.com/problems/kth-largest-element-in-an-array/editorial/
public int findKthLargest_3(int[] nums, int k) {
PriorityQueue<Integer> heap = new PriorityQueue<>();
for (int num: nums) {
heap.add(num);
if (heap.size() > k) {
heap.remove();
}
}
return heap.peek();
}
// V3
// IDEA : Quickselect
// https://leetcode.com/problems/kth-largest-element-in-an-array/editorial/
public int findKthLargest_4(int[] nums, int k) {
List<Integer> list = new ArrayList<>();
for (int num: nums) {
list.add(num);
}
return quickSelect(list, k);
}
public int quickSelect(List<Integer> nums, int k) {
int pivotIndex = new Random().nextInt(nums.size());
int pivot = nums.get(pivotIndex);
List<Integer> left = new ArrayList<>();
List<Integer> mid = new ArrayList<>();
List<Integer> right = new ArrayList<>();
for (int num: nums) {
if (num > pivot) {
left.add(num);
} else if (num < pivot) {
right.add(num);
} else {
mid.add(num);
}
}
if (k <= left.size()) {
return quickSelect(left, k);
}
if (left.size() + mid.size() < k) {
return quickSelect(right, k - left.size() - mid.size());
}
return pivot;
}
// V4
// IDEA : Counting Sort
// https://leetcode.com/problems/kth-largest-element-in-an-array/editorial/
public int findKthLargest_5(int[] nums, int k) {
int minValue = Integer.MAX_VALUE;
int maxValue = Integer.MIN_VALUE;
for (int num: nums) {
minValue = Math.min(minValue, num);
maxValue = Math.max(maxValue, num);
}
int[] count = new int[maxValue - minValue + 1];
for (int num: nums) {
count[num - minValue]++;
}
int remain = k;
for (int num = count.length - 1; num >= 0; num--) {
remain -= count[num];
if (remain <= 0) {
return num + minValue;
}
}
return -1;
}
}