题目描述
解法 小根堆解决TOP K问题
小根堆解决TOP K思路:
找最小值
首先建立大根堆,然后压入k个数
剩下来的每个数先压入,然后弹出堆顶元素
全部元素压入结束后堆顶就是第k小的数
找最大值
首先建立小根堆,然后压入k个数
剩下来的每个数先压入,然后弹出堆顶元素
全部元素压入结束后堆顶就是第k大的数
ps:C++默认的是大根堆,这里可以记一下大小根的写法
- 小跟greater
-
priority_queue<int, vector<int>, greater<int>> q;
- 大根less
-
priority_queue<int, vector<int>, less<int>> q;
class KthLargest {
public:
//小根堆 堆首取第k大元素
priority_queue<int, vector<int>, greater<int>> q;
int k;
KthLargest(int k, vector<int>& nums) {
this -> k = k;
this -> q = priority_queue<int, vector<int>, greater<int>> (nums.begin(), nums.end());
}
int add(int val) {
q.push(val);
if(q.size() < k) return NULL;
while(q.size() > k) {
q.pop();
}
return q.top();
}
};
/**
* Your KthLargest object will be instantiated and called as such:
* KthLargest* obj = new KthLargest(k, nums);
* int param_1 = obj->add(val);
*/
时间复杂度O(1) add函数的平均复杂度
空间复杂度O(n)