Leetcode 703. 数据流中的第 K 大元素(终于解决)
设计一个找到数据流中第 k 大元素的类(class)。注意是排序后的第 k 大元素,不是第 k 个不同的元素。
请实现 KthLargest 类:
- KthLargest(int k, int[] nums) 使用整数 k 和整数流 nums 初始化对象。
- int add(int val) 将 val 插入数据流 nums 后,返回当前数据流中第 k 大的元素。
示例:
输入: ["KthLargest", "add", "add", "add", "add", "add"] [[3, [4, 5, 8, 2]], [3], [5], [10], [9], [4]] 输出: [null, 4, 5, 5, 8, 8] 解释: KthLargest kthLargest = new KthLargest(3, [4, 5, 8, 2]); kthLargest.add(3); // return 4 kthLargest.add(5); // return 5 kthLargest.add(10); // return 5 kthLargest.add(9); // return 8 kthLargest.add(4); // return 8
提示:
- 1 <= k <= 10^4
- 0 <= nums.length <= 10^4
- -10 ^ 4 <= nums[i] <= 10^4
- -10^ 4 <= val <= 10^4
- 最多调用 add 方法 10^4 次
- 题目数据保证,在查找第 k 大元素时,数组中至少有 k 个元素
主要思路:一开始以位只要直接sort就行,但是测试案例9会显示超时
看了看评论区,有用到队列。思考一番,便采用优先队列解决
Code:
class KthLargest { public: KthLargest(int k, vector<int>& nums) { m_index=k; m_vec=nums; size=k; if(m_vec.size()) sort(m_vec.begin(),m_vec.end(),greater<int>()); if(m_vec.size()) { for(int i=0;i<k&&(i<nums.size());i++) { m_q.push(m_vec[i]); } } } int add(int val) { if(m_q.size()) { if(m_q.size()!=size) { m_q.push(val); return m_q.top(); } if(val>m_q.top()) { if((int)m_q.size()==size) { m_q.pop(); m_q.push(val); } else { m_q.push(val); } cout<<"end"<<endl; } } else m_q.push(val); return m_q.top(); } private: int m_index=0; vector<int>m_vec; int m_num=0; int size; priority_queue<int,vector<int>, greater<int> > m_q; }; /** * Your KthLargest object will be instantiated and called as such: * KthLargest* obj = new KthLargest(k, nums); * int param_1 = obj->add(val); */
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)