-->

Friday, December 30, 2016

215. Kth Largest Element in an Array

https://leetcode.com/problems/kth-largest-element-in-an-array/

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);
            }
        }
    }
};

No comments :

Post a Comment