剑指offer59:滑动窗口的最大值

2024-01-03 05:59

本文主要是介绍剑指offer59:滑动窗口的最大值,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 

目录

题目一:

题目二:


题目一:

思路一:遍历,时间复杂度是O(nk)

思路二:用一个堆来维护一个有序队列,具体代码如下所示:

class Solution {
public:vector<int> maxSlidingWindow(vector<int>& nums, int k) {int len=nums.size();if(len==0) return {};priority_queue<pair<int,int>> q;for(int i=0;i<k;++i){q.emplace(nums[i],i);}vector<int> ans={q.top().first};for(int i=k;i<len;++i){q.emplace(nums[i],i);while(q.top().second<=i-k){q.pop();}ans.push_back(q.top().first);}return ans;}
};

最坏情况是原数组是一个递增序列,时间复杂度是O(nlogn)

思路三:

单调栈的思想,维护一个递减序列。这里以{2,3,4,2,6,2,5,1}为例子:

我们首先把2拿出来,然后拿出3,这时候2就可以丢掉了,因为它不可能是最大值,之后拿4,同理3可以丢掉了,接下来拿2,这个2比4小,我们把他放在4后面。为什么2不要丢掉呢?因为当滑动窗口滑出4时,2仍然有可能是最大值。

由于考虑到下标可以作为删除元素的条件,所以我们可以来维护一个递减的双向队列,其中的元素是nums的下标。具体代码如下所示:

class Solution {
public:vector<int> maxSlidingWindow(vector<int>& nums, int k) {int len=nums.size();if(len==0) return {};vector<int> ans;deque<int> q;for(int i=0;i<k;++i){while(!q.empty()&&nums[i]>=nums[q.back()]){q.pop_back();}q.push_back(i);}ans.push_back(nums[q.front()]);for(int i=k;i<len;++i){while(!q.empty()&&nums[i]>=nums[q.back()]){q.pop_back();}q.push_back(i);if(q.front()<=i-k){q.pop_front();}ans.push_back(nums[q.front()]);}return ans;}
};

之后关于到底是nums[i]>=还是>nums[q.back()]我是抱有疑问的,但是好像都行这里,但是严格来说我觉得等于才行,比如333332,这样一个序列,如果没有等于,那应该是不行的。。。为什么力扣里边等于有没有都行呢。。。不是很能理解

关于时间复杂度应该是降低为O(n)了。

题目二:

思路一:

请欣赏暴力求解:

class MaxQueue {int q[20000];int begin = 0, end = 0;
public:MaxQueue() {}int max_value() {int ans = -1;for (int i = begin; i != end; ++i)ans = max(ans, q[i]);return ans;}void push_back(int value) {q[end++] = value;}int pop_front() {if (begin == end)return -1;return q[begin++];}
};作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/dui-lie-de-zui-da-zhi-lcof/solution/mian-shi-ti-59-ii-dui-lie-de-zui-da-zhi-by-leetcod/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

思路二:我们可以受上面单调栈思路的启发,除了本身的队列,利用单调栈的思想,用另外一个双端队列来求最大值:

class MaxQueue {queue<int> q;deque<int> d;
public:MaxQueue() {}int max_value() {if(d.empty()) return -1;return d.front();}void push_back(int value) {while(!d.empty()&&value>=d.back()){d.pop_back();}d.push_back(value);q.push(value);}int pop_front() {if(q.empty()) return -1;int ans=q.front();if(ans==d.front()){d.pop_front();}q.pop();return ans;}
};

这样维护求最大值的时间从O(n)降至O(1),弹出的时间都是O(1),插入的时间不知道怎么分析单调栈的。。。

这篇关于剑指offer59:滑动窗口的最大值的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

PostgreSQL中rank()窗口函数实用指南与示例

《PostgreSQL中rank()窗口函数实用指南与示例》在数据分析和数据库管理中,经常需要对数据进行排名操作,PostgreSQL提供了强大的窗口函数rank(),可以方便地对结果集中的行进行排名... 目录一、rank()函数简介二、基础示例:部门内员工薪资排名示例数据排名查询三、高级应用示例1. 每

Windows的CMD窗口如何查看并杀死nginx进程

《Windows的CMD窗口如何查看并杀死nginx进程》:本文主要介绍Windows的CMD窗口如何查看并杀死nginx进程问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录Windows的CMD窗口查看并杀死nginx进程开启nginx查看nginx进程停止nginx服务

使用WPF实现窗口抖动动画效果

《使用WPF实现窗口抖动动画效果》在用户界面设计中,适当的动画反馈可以提升用户体验,尤其是在错误提示、操作失败等场景下,窗口抖动作为一种常见且直观的视觉反馈方式,常用于提醒用户注意当前状态,本文将详细... 目录前言实现思路概述核心代码实现1、 获取目标窗口2、初始化基础位置值3、创建抖动动画4、动画完成后

Python中pywin32 常用窗口操作的实现

《Python中pywin32常用窗口操作的实现》本文主要介绍了Python中pywin32常用窗口操作的实现,pywin32主要的作用是供Python开发者快速调用WindowsAPI的一个... 目录获取窗口句柄获取最前端窗口句柄获取指定坐标处的窗口根据窗口的完整标题匹配获取句柄根据窗口的类别匹配获取句

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

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

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

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

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

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

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

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

使用JS/Jquery获得父窗口的几个方法(笔记)

<pre name="code" class="javascript">取父窗口的元素方法:$(selector, window.parent.document);那么你取父窗口的父窗口的元素就可以用:$(selector, window.parent.parent.document);如题: $(selector, window.top.document);//获得顶级窗口里面的元素 $(

专题二_滑动窗口_算法专题详细总结

目录 滑动窗口,引入: 滑动窗口,本质:就是同向双指针; 1.⻓度最⼩的⼦数组(medium) 1.解析:给我们一个数组nums,要我们找出最小子数组的和==target,首先想到的就是暴力解法 1)暴力: 2)优化,滑动窗口: 1.进窗口 2.出窗口 3.更新值 2.⽆重复字符的最⻓⼦串(medium) 1)仍然是暴力解法: 2)优化: 进窗口:hash[s[rig