算法训练day13 LeetCode 239

news/发布时间2024/5/20 4:10:29

算法训练day13 LeetCode 239.滑动窗口最大值347.前k个高频元素

239.滑动窗口最大值

题目

239. 滑动窗口最大值 - 力扣(LeetCode)

题解

代码随想录 (programmercarl.com)

  • class Solution {
    private:class MyQueue { //单调队列(从大到小)public:deque<int> que; // 使用deque来实现单调队列// 每次弹出的时候,比较当前要弹出的数值是否等于队列出口元素的数值,如果相等则弹出。// 同时pop之前判断队列当前是否为空。void pop(int value) {if (!que.empty() && value == que.front()) {que.pop_front();}}// 如果push的数值大于入口元素的数值,那么就将队列后端的数值弹出,直到push的数值小于等于队列入口元素的数值为止。// 这样就保持了队列里的数值是单调从大到小的了。void push(int value) {while (!que.empty() && value > que.back()) {que.pop_back();}que.push_back(value);}// 查询当前队列里的最大值 直接返回队列前端也就是front就可以了。int front() {return que.front();}};
    public:vector<int> maxSlidingWindow(vector<int>& nums, int k) {MyQueue que;vector<int> result;for (int i = 0; i < k; i++) { // 先将前k的元素放进队列que.push(nums[i]);}result.push_back(que.front()); // result 记录前k的元素的最大值for (int i = k; i < nums.size(); i++) {que.pop(nums[i - k]); // 滑动窗口移除最前面元素que.push(nums[i]); // 滑动窗口前加入最后面的元素result.push_back(que.front()); // 记录对应的最大值}return result;}
    };
    
  • 大体理解了思路,代码没有办法独立完成。

    • 利用队列实现窗口的功能。
    • 利用输入时对数据的处理,实现对最大值的确定并方便之后的输出
    • 解决问题先明确大体框架,再实现具体细节

347.前k个高频元素

题目:

347. 前 K 个高频元素 - 力扣(LeetCode)

题解:

代码随想录 (programmercarl.com)

  • 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; // map<nums[i],对应出现的次数>for (int i = 0; i < nums.size(); i++) {map[nums[i]]++;}// 对频率排序// 定义一个小顶堆,大小为kpriority_queue<pair<int, int>, vector<pair<int, int>>, mycomparison> pri_que;// 用固定大小为k的小顶堆,扫面所有频率的数值for (unordered_map<int, int>::iterator it = map.begin(); it != map.end(); it++) {pri_que.push(*it);if (pri_que.size() > k) { // 如果堆的大小大于了K,则队列弹出,保证堆的大小一直为kpri_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;}
    };
    
  • 思路理解,代码无法独立实现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ulsteruni.cn/article/42330462.html

如若内容造成侵权/违法违规/事实不符,请联系编程大学网进行投诉反馈email:xxxxxxxx@qq.com,一经查实,立即删除!

相关文章

机器学习算法原理实现——lightgbm,核心leaf-wise生长结合数据和特征并行+直方图算法+单边梯度抽样+互斥特征捆绑

算法亮点: 1、leaf-wise生长策略+特征并行和数据并行 让我们通过一个简单的例子来详细解释 LightGBM 的 Leaf-wise 生长策略。假设我们有以下的数据集:| 年龄 | 收入 | 购买 || ---- | ---- | ---- || 20 | 3000 | 0 || 25 | 3500 | 0 || 30 | 4000 | 0 || 35 | 4500 | 1 ||…

WebStorm 2023:JavaScript开发者的终极利器

WebStorm是JetBrains公司开发的一款强大的JavaScript开发工具,为前端开发者提供了丰富的功能和智能,帮助他们提高开发效率、降低出错率并提高代码质量。 →→↓↓载RubyMine 2023 mac+win版代码提示与自动补全:WebStorm能够根据用户输入的内容,提供代码提示与自动补全功能,…

js循环方式、v-model、事件处理、表单控制、购物车案例

js循环方式 js循环 for(),基于索引的循环 let :es6语法,用于定义变量 const:用于定义常量 var以后尽量少用 、for循环写法一: for循环写法二: 列表循环 循环方式二:in循环 基于迭代的循环,依赖于索引取值 直接console.log是索引值,只有list[i]才是要取的值 循环方式…

少年,该升级 Vue3 了!

Vue2 的终止支持时间是 2023 年 12 月 31 日,本文是一篇 Vue2 升级 Vue3 的指南,可帮助你快速从 Vue2 平滑升级到 Vue3。你好,我是 Kagol。 前言 根据 Vue 官网文档的说明,Vue2 的终止支持时间是 2023 年 12 月 31 日,这意味着从明年开始:Vue2 将不再更新和升级新版本,不…

MinIO分布式部署

目录先决条件网络和防火墙网络防火墙负载均衡顺序的主机名驱动器要求XFS格式性能最优最小IO顺序的驱动器名任意迁移时间同步考虑相同的硬软件环境存储容量规划推荐的操作系统预先存在的数据部署分布式MinIO在每一个节点上安装MinIO创建服务文件minio.service创建环境文件添加TL…

4-微信小程序 相关知识点代码示例

基于上篇文章的理论文本的介绍来进行相关代码的演示和例子 该篇文章需注意,在微信小程序的使用时,应先熟悉里面每个文件的作用,在第二篇文章有详细记载,一般用的比较多的是wxml、wxss、ws.js 对应网站的开发就是html、css、js、页面的内容及框架、页面的美化、页面的基本功…