215. Kth Largest Element in an Array
Given an integer array nums and an integer k, return the k t h k^{th} kth largest element in the array.
Note that it is the k t h k^{th} kth largest element in the sorted order, not the k t h k^{th} kth distinct element.
Can you solve it without sorting?
Example 1:
Input: nums = [3,2,1,5,6,4], k = 2
Output: 5
Example 2:
Input: nums = [3,2,3,1,2,4,5,5,6], k = 4
Output: 4
Constraints:
- 1 < = k < = n u m s . l e n g t h < = 1 0 5 1 <= k <= nums.length <= 10^5 1<=k<=nums.length<=105
- − 1 0 4 < = n u m s [ i ] < = 1 0 4 -10^4 <= nums[i] <= 10^4 −104<=nums[i]<=104
From: LeetCode
Link: 215. Kth Largest Element in an Array
Solution:
Ideas:
This function initializes a min heap with the first k elements of the array, then iterates through the rest of the array, maintaining the heap property and ensuring that only the k largest elements are in the heap. The k t h k^{th} kth largest element is then the smallest element in this heap.
Code:
c
void minHeapify(int* heap, int heapSize, int i) {
int smallest = i;
int left = 2 * i + 1;
int right = 2 * i + 2;
if (left < heapSize && heap[left] < heap[smallest])
smallest = left;
if (right < heapSize && heap[right] < heap[smallest])
smallest = right;
if (smallest != i) {
int temp = heap[i];
heap[i] = heap[smallest];
heap[smallest] = temp;
minHeapify(heap, heapSize, smallest);
}
}
void buildMinHeap(int* heap, int heapSize) {
for (int i = heapSize / 2 - 1; i >= 0; i--)
minHeapify(heap, heapSize, i);
}
int findKthLargest(int* nums, int numsSize, int k) {
int heap[k];
for (int i = 0; i < k; i++)
heap[i] = nums[i];
buildMinHeap(heap, k);
for (int i = k; i < numsSize; i++) {
if (nums[i] > heap[0]) {
heap[0] = nums[i];
minHeapify(heap, k, 0);
}
}
return heap[0];
}