215. Kth Largest Element in an Array

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.

Note:
You may assume k is always valid, 1 ≤ k ≤ array's length.

快速排序

快速排序每轮比较后都会确定 一个中心元素的位置
判断这个元素的是否为 第k大的元素( 即数组下标为 length - k )
如果不是则对比大小
比第k大元素大 则继续对基数的左边排序
比第k大元素大 则继续对基数的右边排序
继续分治直到 第k大元素 被确定

int findKthLargest(vector<int>& nums, int k)
{
    return findKth(nums, 0, nums.size() - 1, k);
}

int findKth(vector<int>& v, int start, int end, int k)
{
    int i = start;
    int j = end;
    int baseVal  = v[start];
    
    //i 位置左边为小于等于 baseVal 的元素
    //j 位置右边为大于 baseVal 的元素
    while(i < j ){
        //寻找 i j
        while(i < j && v[j] > baseVal)
            j--;
        while(i < j && v[i] <= baseVal)
            i++;
        //如果找了 
        if(i < j)
            swap(v[i], v[j]);
    }
    //baseVal 插入 i位置 即中心点
    //此时 v[i] <= baseVal
    swap(v[start], v[i]);
        
    if(i == v.size() - k)
        return baseVal;
    //i 在目标的左边
    else if(i < v.size() - k)
        return findKth(v, i + 1, end, k);
    else
        return findKth(v, start, i - 1, k);
}

STL

最大堆

C++ STL 之 heap、priority_queue 的使用

int findKthLargest(vector<int>& nums, int k) {
    make_heap(nums.begin(),nums.end());
    //弹出前 k 个
    for(int i = 0 ; i < k -1; i++){
        pop_heap(nums.begin(), nums.end());
        nums.pop_back();
    }
    return nums.front();
}

直接用STL函数

int findKthLargest(vector<int>& nums, int k) {
        int size = nums.size();
        if (size<2) return nums[0];
        //按从小到大的顺序 下标为 size - k 的数即第 k 大的数 
        nth_element(nums.begin(),nums.begin() + size - k,nums.end());
        return nums[size - k];
    }

你可能感兴趣的:(215. Kth Largest Element in an Array)