原题地址(简单)

方法1—暴力

思路

我先想到的其实是优先队列,结果发现不太合适,就直接暴力了,因为我发现暴力的时间复杂度也不算太高,每次插入最大703. 数据流中的第 K 大元素 - 图1而已,所以就用暴力做了。

代码

  1. class KthLargest {
  2. public:
  3. vector<int> v;
  4. int K, n;
  5. KthLargest(int k, vector<int>& nums) {
  6. K = k;
  7. v = nums;
  8. n = v.size();
  9. if(n) sort(v.begin(), v.end(), greater<int>());
  10. }
  11. int add(int val) {
  12. v.push_back(val);
  13. n++;
  14. int i = n - 1, tmp = val;
  15. for(; i>=1; i--) {
  16. if(v[i-1] < tmp) v[i] = v[i-1];
  17. else break;
  18. }
  19. v[i] = tmp;
  20. return v[K-1];
  21. }
  22. };
  23. /**
  24. * Your KthLargest object will be instantiated and called as such:
  25. * KthLargest* obj = new KthLargest(k, nums);
  26. * int param_1 = obj->add(val);
  27. */

时空复杂度

时间复杂度 初始化排序时间复杂度为703. 数据流中的第 K 大元素 - 图2,插入的时间复杂度为703. 数据流中的第 K 大元素 - 图3
空间复杂度 存储数据嘛,为703. 数据流中的第 K 大元素 - 图4

方法2—优先队列

思路

优先队列就是堆嘛,每次只能取出一个最大值/最小值,所以要稍微转化一下思路。
用一个小顶堆来存储前K个数,堆顶的数不就是整个数组的第K大的数了嘛

代码

  1. class KthLargest {
  2. public:
  3. priority_queue<int, vector<int>, greater<int>> q; // 存从大到小排列的前k个数
  4. int K;
  5. KthLargest(int k, vector<int>& nums) {
  6. K = k;
  7. for(auto num : nums) q.push(num);
  8. int n = nums.size();
  9. for(int i=1; i<=n-K; i++) q.pop();
  10. }
  11. int add(int val) {
  12. q.push(val);
  13. if(q.size() == K+1) q.pop(); // 加if是为了初始数组nums为空时也不出问题
  14. return q.top();
  15. }
  16. };
  17. /**
  18. * Your KthLargest object will be instantiated and called as such:
  19. * KthLargest* obj = new KthLargest(k, nums);
  20. * int param_1 = obj->add(val);
  21. */

时空复杂度

时间复杂度 初始化为703. 数据流中的第 K 大元素 - 图5,也就是建堆的时间复杂度,插入为703. 数据流中的第 K 大元素 - 图6
空间复杂度 703. 数据流中的第 K 大元素 - 图7