解法一:
将数组排完序后直接返回第k-1个元素
class
效果图:
解法二:维护一个大小为k的小根堆
class Solution {
public:
int findKthLargest(vector<int>& nums, int k) {
vector<int> minstack(k);
for(int i=0;i<k;i++)
{
minstack[i]=nums[i];
}
make_heap(minstack.begin(),minstack.end(),greater<int>());//将前k个元素创建小根堆
for(int i=k;i<nums.size();i++) //从第k+1个元素开始
{
if(nums[i]>minstack[0])//若比根节点大则插入
{
minstack.push_back(nums[i]);
push_heap(minstack.begin(),minstack.end(),greater<int>());
}
if(minstack.size()>k)
{
pop_heap(minstack.begin(),minstack.end(),greater<int>());
minstack.pop_back();
}
}
return minstack[0];
}
};
效果图:
解法三:
用优先队列创建小根堆
class Solution {
public:
int findKthLargest(vector<int>& nums, int k) {
priority_queue<int,vector<int>,greater<int>> minstack(1,nums[0]);
for(int i=1;i<nums.size();i++)
{
minstack.push(nums[i]);
if(minstack.size()>k)
minstack.pop();
}
return minstack.top();
}
};
运行效果图:
原文链接:
https://blog.csdn.net/weixin_39139505/article/details/89450769blog.csdn.netC++优先队列连接:
c++优先队列(priority_queue)用法详解 - 华山青竹 - 博客园www.cnblogs.comC++ great()用法:
https://blog.csdn.net/u014800748/article/details/38449591blog.csdn.netc++ make_heap(), pop_heap()函数:
https://blog.csdn.net/u012604810/article/details/80912794blog.csdn.net#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
vector<int> nums={4,5,1,3,2};
make_heap(nums.begin(),nums.end(),greater<int>());//默认是大根堆,若第三个参数是greater<int>(),则为小根堆。把最小的元素放在最前面,其余不管.
for(int i=0;i<nums.size();i++)
cout<<nums[i]<<" ";
cout<<endl;
pop_heap(nums.begin(), nums.end(),greater<int>());//将最小的元素放到最后面,其余不管
for(int i=0;i<nums.size();i++)
cout<<nums[i]<<" ";
cout<<endl;
nums.pop_back();//删除最后一个元素
for(int i=0;i<nums.size();i++)
cout<<nums[i]<<" ";
cout<<endl;
nums.push_back(7);//从尾部加一个元素
for(int i=0;i<nums.size();i++)
cout<<nums[i]<<" ";
cout<<endl;
push_heap(nums.begin(), nums.end());
for(int i=0;i<nums.size();i++)
cout<<nums[i]<<" ";
cout<<endl;
}
运行结果: