day13 - 栈与队列part03
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | // 队列que是STL的双向队列deque // 队列存放的是元素在序列中的序号 //参考https://www.jianshu.com/p/e59d51e1eef5 class Solution { public : vector< int > maxSlidingWindow(vector< int >& nums, int k) { deque< int > deque_1; vector< int > result; for ( int i=0; i<nums.size(); i++){ while (!deque_1.empty() && nums[deque_1.back()] < nums[i]){ deque_1.pop_back(); } deque_1.push_back(i); if (i>=k-1){ while (!deque_1.empty() && deque_1.front()<i-k+1){ deque_1.pop_front(); } result.push_back(nums[deque_1.front()]); } } return result; } }; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | class Solution { public : // 小顶堆 class mycomparison { public : bool operator ()( const pair< int , int >& lhs, const pair< int , int >& rhs) { return lhs.second > rhs.second; } }; vector< int > topKFrequent(vector< int >& nums, int k) { unordered_map< int , int > map_1; for ( int i=0; i<nums.size(); i++) map_1[nums[i]]++; // 对频率排序 // 定义一个小顶堆,大小为k priority_queue<pair< int , int >, vector<pair< int , int >>, mycomparison> pri_que; // 用固定大小为k的小顶堆,扫面所有频率的数值 for (unordered_map< int , int >::iterator it=map_1.begin(); it != map_1.end(); it++){ pri_que.push(*it); if (pri_que.size() > k) { // 如果堆的大小大于了K,则队列弹出,保证堆的大小一直为k pri_que.pop(); } } // 找出前K个高频元素,因为小顶堆先弹出的是最小的,所以倒序来输出到数组 vector< int > result(k); for ( int i = k - 1; i >= 0; i--) { result[i] = pri_que.top().first; pri_que.pop(); } return result; } }; |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话