原题地址(简单)
方法1—暴力
思路
我先想到的其实是优先队列,结果发现不太合适,就直接暴力了,因为我发现暴力的时间复杂度也不算太高,每次插入最大而已,所以就用暴力做了。
代码
class KthLargest {public:vector<int> v;int K, n;KthLargest(int k, vector<int>& nums) {K = k;v = nums;n = v.size();if(n) sort(v.begin(), v.end(), greater<int>());}int add(int val) {v.push_back(val);n++;int i = n - 1, tmp = val;for(; i>=1; i--) {if(v[i-1] < tmp) v[i] = v[i-1];else break;}v[i] = tmp;return v[K-1];}};/*** Your KthLargest object will be instantiated and called as such:* KthLargest* obj = new KthLargest(k, nums);* int param_1 = obj->add(val);*/
时空复杂度
时间复杂度 初始化排序时间复杂度为,插入的时间复杂度为
空间复杂度 存储数据嘛,为
方法2—优先队列
思路
优先队列就是堆嘛,每次只能取出一个最大值/最小值,所以要稍微转化一下思路。
用一个小顶堆来存储前K个数,堆顶的数不就是整个数组的第K大的数了嘛
代码
class KthLargest {public:priority_queue<int, vector<int>, greater<int>> q; // 存从大到小排列的前k个数int K;KthLargest(int k, vector<int>& nums) {K = k;for(auto num : nums) q.push(num);int n = nums.size();for(int i=1; i<=n-K; i++) q.pop();}int add(int val) {q.push(val);if(q.size() == K+1) q.pop(); // 加if是为了初始数组nums为空时也不出问题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);*/
时空复杂度
时间复杂度 初始化为,也就是建堆的时间复杂度,插入为
空间复杂度
