147.栈与队列:滑动窗口最大值(力扣)

2024-05-28 06:12

本文主要是介绍147.栈与队列:滑动窗口最大值(力扣),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

代码解决

class Solution {
private:class MyQueue{public:deque<int> que;// 删除队列中的元素,如果该元素等于队列的front// 这是为了保持队列中元素的正确性void pop(int val){if(!que.empty() && val == que.front()){que.pop_front();}}// 添加元素到队列,同时维护队列中的元素是降序的// 通过移除所有小于当前值的元素,保证队列中的最大值在front位置void push(int val){while(!que.empty() && val > que.back()){que.pop_back();}que.push_back(val);}// 获取队列的最大值(即队列的front)int front(){return que.front();}};public:vector<int> maxSlidingWindow(vector<int>& nums, int k) {MyQueue que;vector<int> result;// 初始化前k个元素到队列for(int i = 0; i < k; i++){que.push(nums[i]);}// 记录第一个窗口的最大值result.push_back(que.front());// 滑动窗口遍历后面的元素for(int i = k; i < nums.size(); i++){// 移除窗口最左侧的元素que.pop(nums[i - k]);// 添加窗口最右侧的元素que.push(nums[i]);// 记录当前窗口的最大值result.push_back(que.front());}return result;}
};
  1. deque<int> que:

    • 使用双端队列来维护一个单调队列,队列中的元素是降序排列的。
  2. void pop(int val):

    • 如果队列不为空且要移除的值等于队列的前端值,则从队列中弹出该值。这一步是为了确保窗口的正确性。
  3. void push(int val):

    • 将新值 val 推入队列前,移除队列中所有小于 val 的元素。这保证了队列的降序性,因此队列的前端始终是最大值。
  4. int front():

    • 返回队列的前端值,这就是当前窗口的最大值。
maxSlidingWindow 方法
  1. MyQueue que:

    • 创建一个 MyQueue 实例来管理滑动窗口内的元素。
  2. vector<int> result:

    • 存储每个滑动窗口的最大值。
  3. 初始化前k个元素到队列:

    • 将前 k 个元素推入 MyQueue 中。
  4. result.push_back(que.front()):

    • 记录第一个滑动窗口的最大值。
  5. 滑动窗口遍历后面的元素:

    • 从第 k 个元素开始遍历到数组末尾:
      • 移除窗口最左侧的元素。
      • 添加窗口最右侧的元素。
      • 记录当前窗口的最大值。

这篇关于147.栈与队列:滑动窗口最大值(力扣)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1009754

相关文章

MySQL高级查询之JOIN、子查询、窗口函数实际案例

《MySQL高级查询之JOIN、子查询、窗口函数实际案例》:本文主要介绍MySQL高级查询之JOIN、子查询、窗口函数实际案例的相关资料,JOIN用于多表关联查询,子查询用于数据筛选和过滤,窗口函... 目录前言1. JOIN(连接查询)1.1 内连接(INNER JOIN)1.2 左连接(LEFT JOI

SpringKafka错误处理(重试机制与死信队列)

《SpringKafka错误处理(重试机制与死信队列)》SpringKafka提供了全面的错误处理机制,通过灵活的重试策略和死信队列处理,下面就来介绍一下,具有一定的参考价值,感兴趣的可以了解一下... 目录引言一、Spring Kafka错误处理基础二、配置重试机制三、死信队列实现四、特定异常的处理策略五

Spring Boot整合消息队列RabbitMQ的实现示例

《SpringBoot整合消息队列RabbitMQ的实现示例》本文主要介绍了SpringBoot整合消息队列RabbitMQ的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的... 目录RabbitMQ 简介与安装1. RabbitMQ 简介2. RabbitMQ 安装Spring

Python使用Pandas对比两列数据取最大值的五种方法

《Python使用Pandas对比两列数据取最大值的五种方法》本文主要介绍使用Pandas对比两列数据取最大值的五种方法,包括使用max方法、apply方法结合lambda函数、函数、clip方法、w... 目录引言一、使用max方法二、使用apply方法结合lambda函数三、使用np.maximum函数

如何通过Python实现一个消息队列

《如何通过Python实现一个消息队列》这篇文章主要为大家详细介绍了如何通过Python实现一个简单的消息队列,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录如何通过 python 实现消息队列如何把 http 请求放在队列中执行1. 使用 queue.Queue 和 reque

解读Redis秒杀优化方案(阻塞队列+基于Stream流的消息队列)

《解读Redis秒杀优化方案(阻塞队列+基于Stream流的消息队列)》该文章介绍了使用Redis的阻塞队列和Stream流的消息队列来优化秒杀系统的方案,通过将秒杀流程拆分为两条流水线,使用Redi... 目录Redis秒杀优化方案(阻塞队列+Stream流的消息队列)什么是消息队列?消费者组的工作方式每

Redis延迟队列的实现示例

《Redis延迟队列的实现示例》Redis延迟队列是一种使用Redis实现的消息队列,本文主要介绍了Redis延迟队列的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习... 目录一、什么是 Redis 延迟队列二、实现原理三、Java 代码示例四、注意事项五、使用 Redi

bat脚本启动git bash窗口,并执行命令方式

《bat脚本启动gitbash窗口,并执行命令方式》本文介绍了如何在Windows服务器上使用cmd启动jar包时出现乱码的问题,并提供了解决方法——使用GitBash窗口启动并设置编码,通过编写s... 目录一、简介二、使用说明2.1 start.BAT脚本2.2 参数说明2.3 效果总结一、简介某些情

基于Redis有序集合实现滑动窗口限流的步骤

《基于Redis有序集合实现滑动窗口限流的步骤》滑动窗口算法是一种基于时间窗口的限流算法,通过动态地滑动窗口,可以动态调整限流的速率,Redis有序集合可以用来实现滑动窗口限流,本文介绍基于Redis... 滑动窗口算法是一种基于时间窗口的限流算法,它将时间划分为若干个固定大小的窗口,每个窗口内记录了该时间

hdu1180(广搜+优先队列)

此题要求最少到达目标点T的最短时间,所以我选择了广度优先搜索,并且要用到优先队列。 另外此题注意点较多,比如说可以在某个点停留,我wa了好多两次,就是因为忽略了这一点,然后参考了大神的思想,然后经过反复修改才AC的 这是我的代码 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<