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);
}
};
leetcode 215 找出第k大的元素
最新推荐文章于 2021-06-07 19:00:39 发布