代码算法训练营day13 | 239. 滑动窗口最大值、347.前 K 个高频元素

day13:

  • 239. 滑动窗口最大值
      • 1、(暴力算法)思路:
      • 2、(单调队列)思路:
  • 347.前 K 个高频元素

239. 滑动窗口最大值

题目链接
状态:暴力ok
文档:programmercarl.com

1、(暴力算法)思路:

一共有两层循环,外层循环(N)迭代变量,内层循环(K)每一个窗口,并计算这个窗口的最大值。时间复杂度O(N*K)。

代码:

class Solution {
public:
//暴力vector<int> maxSlidingWindow(vector<int>& nums, int k) {  //短路条件int size = nums.size();//存放结果的数组vector<int> result;if(size == 0) return result;for(int i=0;i<=size-k;i++){//最大值int max = nums[i];for(int j=i;j<=i+k-1;j++){//计算每个窗口内的最大值if(nums[j] > max) max = nums[j];}result.push_back(max);}return result;}
};

2、(单调队列)思路:

239思路图
可以看到,每移动一次窗口,原理上都是把左边的元素pop出去,右边新加一个元素进来。
但是有时候并不需要去pop那个被窗口抛弃的元素,因为在某些元素push进来之前,我们会先对队列进行一个判断大小的操作:

  • 如果要push进来的元素比队列入口处的元素大,那么就要把这些元素一 一pop掉,(因此之后可能就不用去pop那个被窗口抛弃的元素,因为已经被pop掉了)这样就保证了队列是一个单调递减的队列。
  • 之后若要pop出口处的元素,那么下一个元素一定是下一个窗口的最大值。
  • 并且,若pop的元素==队列出口的元素,那么说明pop的元素是这个窗口的最大值。

代码:

class Solution {
private:class MyQueue{public://定义一个队列que,实现单调队列deque<int> que;// 每次弹出的时候,比较当前要弹出的数值是否等于队列出口元素的数值,如果相等则弹出。// 如果不相等的话说明此时要pop的数比出口数小,在出口数push前该数就已经被pop了。// 同时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(); // 把小的数都pop//小的数pop完再push新的大的数que.push_back(value);}// 返回窗口最大值int getWindowMax(){return que.front();}};
public:vector<int> maxSlidingWindow(vector<int>& nums, int k) {MyQueue que;vector<int> result;//先把前k个数放到que中for(int i=0;i<k;i++){que.push(nums[i]);  // 已经保证现在的队列是一个单调队列了}// 此时已经产生了一个窗口的最大值,记录下来result.push_back(que.getWindowMax()); // 窗口移动时,左边的元素被移除,右边的元素会新加进来for(int j=k;j<nums.size();j++){// 左边的元素移除掉que.pop(nums[j-k]);// 右边的元素加进来que.push(nums[j]);// 形成了新的窗口,返回窗口的最大值result.push_back(que.getWindowMax()); }return result;}
};

注意:
在push函数中,判断要加进来的value是否>队列入口处的值时,因为这个比较次数是不确定的,所以不能用if判断,而要用while判断才行。

347.前 K 个高频元素

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

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

相关文章

[C语言]——动态内存经典笔试题分析

目录 一.题目1 1.运行结果 2.分析 3.问题所在 4.更正 二.题目2 1.运行结果 2.分析 3.问题所在 4.更正 三.题目3 1.问题所在 2.更正&#xff1a; 四.题目4 一.题目1 void GetMemory(char *p){p (char *)malloc(100);}void Test(void){char *str NULL;GetMemory…

图像版PDF文件OCR识别转换为文本的3款免费工具软件

图像版PDF文件里面都是图片&#xff0c;要先通过OCR技术识别出文本&#xff0c;然后才能进行进一步处理编辑。下面是3个免费的PDF文件OCR识别软件工具&#xff1a; ●简可信PDF批量识别工具 简可信PDF批量识别工具是一款专门用于将PDF文件进行批量OCR&#xff08;光学字符识别…

三星:HBM4的16层堆叠技术验证成功

随着人工智能、大数据分析、云计算及高端图形处理等领域对高速、高带宽存储需求的激增&#xff0c;下一代高带宽内存&#xff08;High Bandwidth Memory, HBM&#xff09;——HBM4已成为全球存储芯片巨头三星、SK海力士和美光竞相追逐的技术高地。 随着AI、机器学习以及高性能…

【大数据】常见问题解决1

目录 一、解决虚拟机ping www.baidu.com 不通问题 二、解决HBase集群中的Hmaster节点刚启动就消息 三、 Hadoop3.x和Hadoop2.x的区别 一、解决虚拟机ping www.baidu.com 不通问题 1&#xff09;首先保证主机连上网络 2&#xff09;sudo vim /etc/resolv.conf 3&#xff09;…

Linux-等待子进程

参考资料&#xff1a;《Linux环境编程&#xff1a;从应用到内核》 僵尸进程 进程退出时会进行内核清理&#xff0c;基本就是释放进程所有的资源&#xff0c;这些资源包括内存资源、文件资源、信号量资源、共享内存资源&#xff0c;或者引用计数减一&#xff0c;或者彻底释放。…

(1)步态识别论文研读GaitSet: Regarding Gait as a Set for Cross-View Gait Recognition

题目&#xff1a;GaitSet 将跨视角步态识别识别任务中的步态视为一个集合 摘要&#xff1a; 作为一个可以在一定距离内识别的独特的生物特征&#xff0c;步态识别在预防犯罪、法医鉴定&#xff0c;和社会保障等方面具有广阔的应用前景&#xff0c;为了描述一个步态&#xff0…

RabbitMQ基本使用及企业开发中注意事项

目录 一、基本使用 二、使用注意事项 1. 生产者重连机制 - 保证mq服务是通的 2. 生产者确认机制 - 回调机制 3. MQ的可靠性 4. Lazy Queue模式 5. 消费者确认机制 一、基本使用 部署完RabbitMQ有两种使用方式&#xff1a; 网页客户端Java代码 MQ组成部分&#xff1a;…

【深度学习】图像风格混合——StyleGAN原理解析

1、前言 上一篇&#xff0c;我们讲了PGGAN的模型原理&#xff0c;本章我们就来讲解一下StyleGAN&#xff0c;这个模型能够自由控制图像的风格&#xff0c;细节变化等等&#xff0c;生成用户想要的图像&#xff0c;甚至从某种程度上说&#xff0c;其可以实现AI换脸。 PS&#…

【跟我每天学习1个QT类】QLibrary类 — 加载管理动态链接库的类

一、QLibrary类简介 由于项目原因&#xff0c;QT软件经常会调用各种各类的库函数&#xff0c;Qt框架中提供的一个类&#xff0c;用于在运行时动态加载和访问共享库&#xff08;也称作动态链接库&#xff0c;DLLs&#xff09;&#xff0c;实现对库中函数、变量等符号的透明调用…

市场复盘总结 20240408

仅用于记录当天的市场情况&#xff0c;用于统计交易策略的适用情况&#xff0c;以便程序回测 短线核心&#xff1a;不参与任何级别的调整&#xff0c;采用龙空龙模式 一支股票 10%的时候可以操作&#xff0c; 90%的时间适合空仓等待 二进三&#xff1a; 进级率 33% 最常用的…

【CTF】rip--堆栈的简单认识

前言 最近在学二进制&#xff0c;准备拿BUUCTF的pwn试试手&#xff0c;还在摸索的阶段&#xff0c;有什么思路出错的地方还请指出。 解题思路 下载文件到kali&#xff0c;查看文件为 64-bit的ELF&#xff08;ELF为Linux下的可执行文件&#xff0c;相当于Windows的exe&#xff0…

Verilog语法——按位取反“~“和位宽扩展的优先级

前言 先说结论&#xff0c;如下图所示&#xff0c;在Verilog中“~ ”按位取反的优先级是最高的&#xff0c;但是在等式计算时&#xff0c;有时候会遇到位宽扩展&#xff0c;此时需要注意的是位宽扩展的优先级高于“~”。 验证 仿真代码&#xff0c;下面代码验证的是“~”按位取…