leetcode 215 找出第k大的元素

class Solution 
{
public:
    void insertandadjustup(vector<int> &num,vector<int> &nums,int n)  //插入并上滤
    {
        num.insert(end(num),nums[n]);
        int j;
        while((j=(n-1)<<2)>=0)    //父节点存在
        {
            if(num[j]>num[n])
            {
              swap(num[j],num[n]);
              n=j;
            }
            else break;
        }
    }
    void insert(vector<int> &num,vector<int> &nums,int n,int k)  //将num设为引用表示它里面的元素可以修改
    {
        if(num.size()<k)
            insertandadjustup(num,nums,n);    //插入并上滤
        else if(num.size()==k)
            if(nums[n]<num[k-1]) 
                return;
            else
            {
                insertandadjustup(num,nums,n); //插入并上滤
                num.pop_back();     //pop_back为删除最后一个元素
            }
    }
    int findKthLargest(vector<int>& nums, int k) 
    {
      int n=nums.size();  //注:STL中的capacity与size的区别:前者表示所能容忍的最多容量,后者表示实际的容量
      vector<int> num;   //新建一个只能k个元素的堆,经不断插入后最后的元素(即堆底)即为第k大的元素
      while(n>=0)
          insert(num,nums,--n,k);
      return num.at(k-1);   
    }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值