(笔试题)滑动窗口的最大值
题目:
给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。
例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5};
针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个:
{[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],2,5,1}, {2,3,4,[2,6,2],5,1}, {2,3,4,2,[6,2,5],1}, {2,3,4,2,6,[2,5,1]}。
思路:
假设窗口大小为w,
1、简单的方法:
遍历数组,从数组第w-1位开始,每次移动一位,并计算窗口w的最大值。
时间复杂度:
计算窗口的最大值需O(w),移动n-w+1次,时间复杂度为O(nw)
2、最大堆方法:
构建一个窗口w大小的最大堆,每次从堆中取出窗口的最大值,随着窗口往右滑动,需要将堆中不属于窗口的堆顶元素删除。
时间复杂度:
正常情况下,往堆中插入数据为O(lgw),如果数组有序,则为O(lgn),因为滑动过程中没有元素从堆中被删除,滑动n-w+1次,复杂度为O(nlgn).
3、双队列方法:
最大堆解法在堆中保存有冗余的元素,比如原来堆中元素为[10 5 3],新的元素为11,则此时堆中会保存有[11 5 3]。其实此时可以清空整个队列,然后再将11加入到队列即可,即只在队列中保持[11]。使用双向队列可以满足要求,滑动窗口的最大值总是保存在队列首部,队列里面的数据总是从大到小排列。当遇到比当前滑动窗口最大值更大的值时,则将队列清空,并将新的最大值插入到队列中。如果遇到的值比当前最大值小,则直接插入到队列尾部。每次移动的时候需要判断当前的最大值是否在有效范围,如果不在,则需要将其从队列中删除。由于每个元素最多进队和出队各一次,因此该算法时间复杂度为O(N)。
代码:
1、简单方法:
int getMax(const int A[],int size){int mx=A[0];for(int i=1;i<size;i++){if(A[i]>mx)mx=A[i];}return mx; } vector<int> maxInWindows(const int A[],int n,int size){vector<int> result;for(int i=0;i<n-size;i++){int num=getMax(A+i,size);result.push_back(num);}return result; }
2、最大堆、双队列方法
class Solution {public://最大堆实现,复杂度O(nlogn)typedef pair<int,int> Pair;vector<int> maxInWindows(const vector<int> &num, unsigned int size) {vector<int> result;priority_queue<Pair> Q;if (num.size() < size || size < 1)return result;for (int i = 0; i < size-1; i++) Q.push(Pair(num[i],i));for (int i = size-1; i < num.size(); i++) {Q.push(Pair(num[i],i));Pair p = Q.top();while(p.second < i-(size-1)) {Q.pop();p = Q.top();}result.push_back(p.first);} return result;}// 双向队列实现,复杂度O(n) vector<int> maxInWindows(const vector<int> &num, unsigned int size) {vector<int> result;deque<int> Q; // int n = num.size();if(num.size()<size || size<=0)return result;for (int i = 0; i < size; i++) {while (!Q.empty() && num[i] > num[Q.back()]) Q.pop_back();Q.push_back(i);}for (int i = size; i < num.size(); i++) {result.push_back(num[Q.front()]);while (!Q.empty() && num[i] >= num[Q.back()]) Q.pop_back();while (!Q.empty() && Q.front() <= i - size) Q.pop_front();Q.push_back(i);}result.push_back(num[Q.front()]);return result;}};
(笔试题)滑动窗口的最大值相关推荐
- 大厂常见笔试题 滑动窗口内数的和
大厂常见笔试题,我以为出一个很难的题,结果出了一个基础题, 给你一个大小为n的整型数组和一个大小为k的滑动窗口,将滑动窗口从头移到尾,输出从开始到结束每一个时刻滑动窗口内的数的和. 样例 对于数组 [ ...
- 【重点】剑指offer——面试题65:滑动窗口的最大值
剑指offer--面试题65:滑动窗口的最大值 Solution1: 笨蛋方法啊.. class Solution { public:vector<int> maxInWindows(co ...
- 面试题59 - I. 滑动窗口的最大值/239. 滑动窗口最大值
2020-05-11 1.题目描述 滑动窗口的最大值 2.题解 使用双端队列维护一个递减的队列 3.代码 class Solution { public:vector<int> maxSl ...
- 剑指offer编程试题Java实现--64.滑动窗口的最大值
个人博客:小景哥哥 64.滑动窗口的最大值 题目描述 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值.例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在 ...
- java 滑动窗口_【Java】 剑指offer(59-1) 滑动窗口的最大值
本文参考自<剑指offer>一书,代码采用Java语言. 题目 给定一个数组和滑动窗口的大小,请找出所有滑动窗口里的最大值.例如,如果输入数组{2, 3, 4, 2, 6, 2, 5, 1 ...
- lintcode 滑动窗口的最大值(双端队列)
题目链接:http://www.lintcode.com/zh-cn/problem/sliding-window-maximum/# 滑动窗口的最大值 给出一个可能包含重复的整数数组,和一个大小为 ...
- 《剑指offer》-- 序列化二叉树、二叉搜索树的第k个节点、数据流中的中位数、滑动窗口的最大值
一.序列化二叉树: 1.题目: 请实现两个函数,分别用来序列化和反序列化二叉树. 2.解题思路: (1)根据前序遍历规则完成序列化与反序列化.所谓序列化指的是遍历二叉树为字符串:所谓反序列化指的是依据 ...
- 62、滑动窗口的最大值
一.题目 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值.例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6 ...
- 牛客题霸 [滑动窗口的最大值] C++题解/答案
牛客题霸 [滑动窗口的最大值] C++题解/答案 题目描述 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值.例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一 ...
最新文章
- 如何从sdcard读取文件
- 如何在 GitHub 上高效搜索开源项目
- java 宕机监控_JAVA实现监测tomcat是否宕机及控制重启的方法
- html中选择样式,html中css三种常见的样式选择器 zz
- matlab画图plot设置字体_R语言科研画图字体格式设置
- 【Java】计算二进制数中1的个数
- linux模块创建proc,[Linux 运维]/proc/modules 以及内核模块工具
- 图像目标检测(Object Detection)原理与实现(三)
- php apache 多进程,php多进程 防止出现僵尸进程 如何 使 apache 成为 僵尸进程
- mysql atlas路由_MySQL中间件 Atlas-1.0.3 安装记录
- 从aspx后台页面向浏览器输出js文件
- 干货满满,图文详解 HDFS 的 工作机制 及其原理
- chmod 755 究竟是什么鬼
- E php短信平台接口
- html 背景图片居中显示,CSS让背景图片居中显示的方法
- Linux网络系统之配置域名与主机名映射和常见网络命令
- RL基础算法优缺点总结
- 超尴尬婆婆对儿媳的新婚之夜的指导
- 原生 js 实现点击按钮复制文本
- asp实训报告摘要_ASP实训总结
热门文章
- 写一个简单易用可扩展vue表单验证插件(vue-validate-easy)
- 浪擎全融合灾备云获大数据安全领域最佳创新奖
- 解决nginx下connect() to 127.0.0.1:3000 failed
- loadrunner如何监控linux,以及重点指标分析
- 分享无限:偷拍IBM power 720内部外部图片
- linux 下搭建postfix服务器
- linux下Java环境的配置
- golang fmt.Print(15 == 1_5)
- Rem布局的原理解析
- Error:The module 'app' is an Android project without build variants, and cannot be built.