leetcode 215. 数组中的第K个最大元素 实现最小堆 随机partition

在这里插入图片描述

template<typename Item>
class MinHeap{
private:
    Item * data;
    int count;// 记录堆中元素个数
    int capacity; // 记录堆中最大可容纳的个数
    void shiftUp(int k){
        while(k>1 && data[k/2]>data[k]){
            swap(data[k/2],data[k]);
            k/=2;
        }
    }
    void shiftDown(int k){
       
        while(2*k<=count){
            int j=2*k;
            if(j+1<=count && data[j+1]<data[j]){
                j++;
            }
            if(data[k]<=data[j]) break;
            swap(data[k],data[j]);
            k=j;
   
        }
    }
public :
    MinHeap(int capacity){
        data=new Item[capacity+1];
        count=0;
        this->capacity=capacity;
    }
    ~MinHeap(){
        delete[] data;
    }
    int size(){
        return count;
    }
    bool isEmpty(){
        return count==0;
    }
    void push(Item item){
        assert(count+1<=capacity);
        data[count+1]=item;
        count++;
        shiftUp(count);
    }
    Item pop(){//extractMin
        assert(count>0);
        Item res=data[1];
        swap(data[1], data[count]);
        count --;
        shiftDown(1);
        return res;
    }
    Item top(){
        assert(count>0);
        return data[1];
    }

};
class Solution {
public:
    int findKthLargest(vector<int>& nums, int k) {
        MinHeap<int>minheap = MinHeap<int>(k);
        // priority_queue<int,vector<int>,greater<int>> minheap;
        for(int i=0;i<k;i++){
            minheap.push(nums[i]);
        }
        for(int i=k;i<nums.size();i++){
            if(nums[i]<=minheap.top()) continue;
            minheap.pop();
            minheap.push(nums[i]);
            
        }
        return minheap.top();
    }
};
class Solution {
public:
    int findKthLargest(vector<int>& nums, int k) {
        k=nums.size()-k;
        return sorted(nums, k, 0,nums.size()-1);
    }
    int sorted(vector<int>nums,  int k, int left,int right){
        
        int piv=partition(nums,left,right);
        if(piv==k) return nums[piv];
        if(piv<k) return sorted(nums,k, piv+1, right);
        return sorted(nums,k, left, piv-1);
    }
    int partition(vector<int>& nums, int left, int right){
        int pivot=left+rand()%(right-left+1);
        swap(nums[pivot],nums[left]);
        int p=left;
        for(int i=left+1;i<=right;i++){
            if(nums[i]<nums[left]){
                p++;
                swap(nums[i],nums[p]);
              
            }
        }
        swap(nums[left],nums[p]);
        return p;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值