[LintCode][Sort][Heap] Kth Largest Element

Problem

More Discussions
Find K-th largest element in an array.

Example

In array [9,3,2,4,8], the 3rd largest element is 4.

In array [1,2,3,4,5], the 1st largest element is 5, 2nd largest element is 4, 3rd largest element is 3 and etc.

Challenge

O(n) time, O(1) extra memory.

Solution

方法一:用最小堆。存k个数,如果当前的数大于最小堆堆顶的数,则弹出堆顶数,当前数入堆。时间O(nlogk)

class Solution {
public:
    /*
     * param k : description of k
     * param nums : description of array and index 0 ~ n-1
     * return: description of return
     */
    int kthLargestElement(int k, vector<int> nums) {
        // write your code here
        priority_queue<int, vector<int>, greater<int> > minHeap;
        for(int i = 0; i < nums.size(); i++) {
            if (minHeap.size() < k) {
                minHeap.push(nums[i]);
            } else {
                if (nums[i] > minHeap.top()) {
                    minHeap.pop();
                    minHeap.push(nums[i]);
                }
            }
        }
        
        return minHeap.top();
    }
};

方法二:快排的思想,找到第k个数。空间O(1),时间的话平均复杂度O(n)

class Solution {
public:
    /*
     * param k : description of k
     * param nums : description of array and index 0 ~ n-1
     * return: description of return
     */
    void partition(vector<int> &a, int beg, int end, int k) {
        if (beg == end) {
            return;
        }
        
        int index = rand() % (end - beg) + beg;
        swap(a[index], a[beg]);
        int key = a[beg];
        int i = beg;
        int j = end;
        while (i < j) {
            if (a[j] >= key) {
                j--;
            } else {
                i++;
                swap(a[i], a[j]);
            }
        }
        
        int mid = i;
        swap(a[beg], a[i]);
        
        if (mid == k) {
            return;
        } else if (mid > k) {
            partition(a, beg, mid - 1, k);
        } else {
            partition(a, mid + 1, end, k);
        }
    }
    
    int kthLargestElement(int k, vector<int> nums) {
        srand (time(NULL));
        partition(nums, 0, nums.size() - 1, nums.size() - k);
        
        return nums[nums.size() - k];
    }
};
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,775评论 0 33
  • Javascript有很多数组的方法,有的人有W3C的API,还可以去MDN上去找,但是我觉得API上说的不全,M...
    顽皮的雪狐七七阅读 4,210评论 0 6
  • 小时候老师说 遇到分叉路不懂走 走右面那条准没错 长大后才知道 这是老师为了避免我们往回走而编的谎言。
    留子尧阅读 260评论 0 4
  • 作为一个催眠治疗师,会经常见证很多“神奇”的催眠治疗案例,正如我们宣传的那样,在我们催眠师的圈子里会经常创造出通过...
    冰雪蝉阅读 2,178评论 2 3
  • 今年九月我教了初一三个班,我校是偏僻的农村中学,大部分家长都出去打工了,留下儿女和爷爷奶奶一起生活,有的小孩家里离...
    梅胜雪阅读 545评论 17 9