lintcode-第k大元素-197(堆的实现)

来源:互联网 发布:js调用css3动画 编辑:程序博客网 时间:2024/04/30 07:39

在数组中找到第k大的元素

您在真实的面试中是否遇到过这个题? 
Yes
样例

给出数组[9,3,2,4,8]第三大的元素是4

给出数组 [1,2,3,4,5],第一大的元素是5,第二大的元素是4,第三大的元素是3,以此类推

class Solution {public:        void insert(vector<int> &heap,int e){        heap.push_back(e);        int size=heap.size();                for(int i=size-1;i>0&&heap[i]<heap[(i-1)/2];i=(i-1)/2)            swap(heap[i],heap[(i-1)/2]);         }        void adjust(vector<int> &heap,int e){        heap[0]=e;        int c,size=heap.size();        for(int i=0;(c=2*i+1)<size;i=c){            if(c+1<size&&heap[c]>heap[c+1])                ++c;            if(heap[i]<heap[c])                break;            swap(heap[i],heap[c]);            }    }        int kthLargestElement(int k, vector<int> nums) {        int size;        if((size=nums.size())<k)            return 0;        vector<int> heap;                for(int i=0;i<k;++i)            insert(heap,nums[i]);        for(int i=k;i<size;++i){            if(nums[i]>heap[0]){                adjust(heap,nums[i]);            }        }        return heap[0];    }};

以下是一个更加快速的版本
class Solution{public:        void insert(vector<int> &heap,int e){        heap.push_back(e);        int size=heap.size();        int tmp=heap[size-1];        int i;        for(i=size-1;i>0&&tmp<heap[(i-1)/2];i=(i-1)/2)            heap[i]=heap[(i-1)/2];        heap[i]=tmp;    }        void adjust(vector<int> &heap,int e){        heap[0]=e;        int c,size=heap.size();        int tmp=heap[0];        int i;        for(i=0;(c=2*i+1)<size;i=c){                        if(c+1<size&&heap[c]>heap[c+1])                ++c;            if(tmp<heap[c])                break;            heap[i]=heap[c];        }        heap[i]=tmp;    }        int kthLargestElement(int k, vector<int> nums) {        int size;        if((size=nums.size())<k)            return 0;        vector<int> heap;                for(int i=0;i<k;++i)            insert(heap,nums[i]);        for(int i=k;i<size;++i){            if(nums[i]>heap[0]){                adjust(heap,nums[i]);            }        }        return heap[0];    }};


0 0
原创粉丝点击