Solution:
Just for the purpose of practice, will use min heap data structure to solve this problem. Then the Kth largest element will be the root of a min heap with size of K.
Need to build a min Heap structure, and the key step is a shift function that will be used in both building and maintaining the heap. See below:
Code:
- class Solution {
- public:
- int findKthLargest(vector<int>& nums, int k) {
- int l = nums.size();
- buildMinHeap(nums, k);
- for(int i=k; i<l; ++i){
- if(nums[i] > nums[0]){
- swap(nums[i], nums[0]);
- shiftHeap(nums, 0, k-1);
- }
- }
- return nums[0];
- }
- private:
- void buildMinHeap(vector<int> &n, int l){
- for(int i=1; i<l; ++i){
- n.insert(n.begin(), n[i]);
- n.erase(n.begin()+i+1);
- shiftHeap(n, 0, i); //maintain an ordered range 0-i;
- }
- }
- void shiftHeap(vector<int> &v, int m, int n){
- if(2*m+1 == n && v[m] > v[n]) swap(v[m], v[n]);//if 2*m + 1 > n, continue;
- if(2*m+2<=n && v[m] > min(v[2*m+1], v[2*m+2])){
- if(v[2*m+1] > v[2*m+2]){
- swap(v[m], v[2*m+2]);
- shiftHeap(v, 2*m+2, n);
- }
- else{
- swap(v[m], v[2*m+1]);
- shiftHeap(v, 2*m+1, n);
- }
- }
- }
- };