题意:给你一个无序数组,返回该数组第K大的数(重复的两个数算两个)。
解题思路:使用优先队列priority_queue<int> q;
一、优先队列声明方式:
priority_queue<int, vector<int>, less<int>> q1(等效于priority_queue<int> ),意思是,声明优先队列,默认是按照大的数排在前面,小的数排在后面。(越往后越less)
priority_queue<int, vector<int>, greater<int>> q1, 升序队列,最小的元素排在前面(越往后越greater)。
二、优先队列用法(和普通队列一样):
q.size();//返回q里元素个数
q.empty();//返回q是否为空,空则返回1,否则返回0
q.push(k);//在q的末尾插入k
q.pop();//删掉q的第一个元素
q.top();//返回q的第一个元素
q.back();//返回q的末尾元素
三、优先队列时间复杂度:
因为优先队列的实现方式堆,堆是一种完全二叉树,在构建优先队列(堆)的时候时间复杂度是O(N),在插入删除的时候时间复杂度是O(logN)。可见操作相当高效。
class Solution {
public:
int findKthLargest(vector<int>& nums, int k) {
priority_queue<int> q;
for(int i = 0; i < nums.size(); i++)
q.push(nums[i]);
for(int i = 0; i < k-1; i++)
q.pop();
return q.top();
}
};