Find the kth largest element in an unsorted array. Note that it is the kth largest element in the sorted order, not the kth distinct element.

For example,
Given [3,2,1,5,6,4] and k = 2, return 5.

 

思路:

堆。讲解:二叉堆

class Solution {
public:
    //新插入i结点 其父节点为(i - 1) / 2
    void MinHeapFixup(int a[], int i) 
    {
        int j = (i - 1) / 2; //父节点
        int temp = a[i];
        while(j >= 0 && i != 0)
        {
            if(a[j] <= temp) break;
            a[i] = a[j];
            i = j;
            j = (i - 1) / 2;
        }
        a[i] = temp;
    }

    //在最小堆中插入新数据nNum
    void MinHeapAddNumber(int a[], int n, int nNum)
    {
        a[n] = nNum;
        MinHeapFixup(a, n);
    }

    //堆删除后的调整  从i节点开始调整,n为节点总数 从0开始计算 i节点的子节点为 2*i+1, 2*i+2
    void MinHeapFixdown(int a[], int i, int n)
    {
        int j = 2 * i + 1;
        int temp = a[i];
        while(j < n)
        {
            if(j + 1 < n && a[j + 1] < a[j]) //在左右孩子中找最小的
                j++;
            if(a[j] >= temp) 
                break;
            a[i] = a[j];  //把较小的子结点往上移动,替换它的父结点
            i = j;
            j = 2 * i  + 1;
        }
        a[i] = temp;
    }

    //在最小堆中删除数
    void MinHeapDeleteNumber(int a[], int n)
    {
        swap(a[0], a[n - 1]);
        MinHeapFixdown(a, 0, n - 1);
    }

    int findKthLargest(vector<int>& nums, int k) {
        int * a = new int[k]; //大小为k的最小堆
        for(int i = 0; i < nums.size(); ++i)
        {
            if(i < k)
            {
                MinHeapAddNumber(a, i, nums[i]); //插入数据
            }
            else if(nums[i] > a[0]) //比已有的k个最大的数字大
            {
                MinHeapDeleteNumber(a, k);
                MinHeapAddNumber(a, k - 1, nums[i]);
            }
        }
        return a[0];
    }
};

 

用STL的堆:

 int findKthLargest(vector<int>& nums, int k) {
    priority_queue<int> p;
    const int s(nums.size());

    for (int i = 0; i < s; ++i) p.push(nums[i]);
    while (--k) p.pop();

    return p.top();
}

堆的相关讲解:

http://www.cnblogs.com/flyoung2008/articles/2136485.html