Skip to content

Commit 2330e68

Browse files
committed
add solution of problem 215: Kth largest element in an array
1 parent f7aef1b commit 2330e68

File tree

2 files changed

+61
-0
lines changed

2 files changed

+61
-0
lines changed
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
Find the **k**th largest element in an unsorted array. Note that it is the kth largest element in the sorted order, not the kth distinct element.
2+
3+
For example,
4+
Given `[3,2,1,5,6,4]` and k = 2, return 5.
5+
6+
#####Note:
7+
You may assume k is always valid, 1 ≤ k ≤ array's length.
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
public class Solution {
2+
public int findKthLargest(int[] nums, int k) {
3+
if (nums == null)
4+
return 0;
5+
6+
int[] minHeap = new int[k + 1];
7+
8+
int idxOfNums = 0;
9+
int idxOfMinHeap = 1;
10+
int numsLen = nums.length;
11+
12+
while (idxOfNums < k) {
13+
minHeap[idxOfMinHeap++] = nums[idxOfNums++];
14+
}
15+
16+
buildMinHeap(minHeap, k);
17+
18+
while (idxOfNums < numsLen) {
19+
if (nums[idxOfNums] > minHeap[1]) {
20+
minHeap[1] = nums[idxOfNums];
21+
siftDown(minHeap, 1, k);
22+
}
23+
24+
idxOfNums++;
25+
}
26+
27+
return minHeap[1];
28+
}
29+
30+
private void buildMinHeap(int[] minHeap, int heapSize) {
31+
int sentinel = heapSize >> 1;
32+
for (int i = sentinel; i >= 1; i--)
33+
siftDown(minHeap, i, heapSize);
34+
}
35+
36+
private void siftDown(int[] minHeap, int idx, int heapSize) {
37+
int sentinel = heapSize >> 1;
38+
39+
while (idx <= sentinel) {
40+
int j = idx << 1;
41+
if (j + 1 <= heapSize && minHeap[j] > minHeap[j+1])
42+
j++;
43+
44+
if (minHeap[j] < minHeap[idx]) {
45+
int tmp = minHeap[j];
46+
minHeap[j] = minHeap[idx];
47+
minHeap[idx] = tmp;
48+
idx = j;
49+
} else {
50+
break;
51+
}
52+
}
53+
}
54+
}

0 commit comments

Comments
 (0)