题目:

给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。

例如,如果输入数组{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;}};

(笔试题)滑动窗口的最大值相关推荐

  1. 大厂常见笔试题 滑动窗口内数的和

    大厂常见笔试题,我以为出一个很难的题,结果出了一个基础题, 给你一个大小为n的整型数组和一个大小为k的滑动窗口,将滑动窗口从头移到尾,输出从开始到结束每一个时刻滑动窗口内的数的和. 样例 对于数组 [ ...

  2. 【重点】剑指offer——面试题65:滑动窗口的最大值

    剑指offer--面试题65:滑动窗口的最大值 Solution1: 笨蛋方法啊.. class Solution { public:vector<int> maxInWindows(co ...

  3. 面试题59 - I. 滑动窗口的最大值/239. 滑动窗口最大值

    2020-05-11 1.题目描述 滑动窗口的最大值 2.题解 使用双端队列维护一个递减的队列 3.代码 class Solution { public:vector<int> maxSl ...

  4. 剑指offer编程试题Java实现--64.滑动窗口的最大值

    个人博客:小景哥哥 64.滑动窗口的最大值 题目描述 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值.例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在 ...

  5. java 滑动窗口_【Java】 剑指offer(59-1) 滑动窗口的最大值

    本文参考自<剑指offer>一书,代码采用Java语言. 题目 给定一个数组和滑动窗口的大小,请找出所有滑动窗口里的最大值.例如,如果输入数组{2, 3, 4, 2, 6, 2, 5, 1 ...

  6. lintcode 滑动窗口的最大值(双端队列)

    题目链接:http://www.lintcode.com/zh-cn/problem/sliding-window-maximum/# 滑动窗口的最大值 给出一个可能包含重复的整数数组,和一个大小为  ...

  7. 《剑指offer》-- 序列化二叉树、二叉搜索树的第k个节点、数据流中的中位数、滑动窗口的最大值

    一.序列化二叉树: 1.题目: 请实现两个函数,分别用来序列化和反序列化二叉树. 2.解题思路: (1)根据前序遍历规则完成序列化与反序列化.所谓序列化指的是遍历二叉树为字符串:所谓反序列化指的是依据 ...

  8. 62、滑动窗口的最大值

    一.题目 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值.例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6 ...

  9. 牛客题霸 [滑动窗口的最大值] C++题解/答案

    牛客题霸 [滑动窗口的最大值] C++题解/答案 题目描述 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值.例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一 ...

最新文章

  1. 如何从sdcard读取文件
  2. 如何在 GitHub 上高效搜索开源项目
  3. java 宕机监控_JAVA实现监测tomcat是否宕机及控制重启的方法
  4. html中选择样式,html中css三种常见的样式选择器 zz
  5. matlab画图plot设置字体_R语言科研画图字体格式设置
  6. 【Java】计算二进制数中1的个数
  7. linux模块创建proc,[Linux 运维]/proc/modules 以及内核模块工具
  8. 图像目标检测(Object Detection)原理与实现(三)
  9. php apache 多进程,php多进程 防止出现僵尸进程 如何 使 apache 成为 僵尸进程
  10. mysql atlas路由_MySQL中间件 Atlas-1.0.3 安装记录
  11. 从aspx后台页面向浏览器输出js文件
  12. 干货满满,图文详解 HDFS 的 工作机制 及其原理
  13. chmod 755 究竟是什么鬼
  14. E php短信平台接口
  15. html 背景图片居中显示,CSS让背景图片居中显示的方法
  16. Linux网络系统之配置域名与主机名映射和常见网络命令
  17. RL基础算法优缺点总结
  18. 超尴尬婆婆对儿媳的新婚之夜的指导
  19. 原生 js 实现点击按钮复制文本
  20. asp实训报告摘要_ASP实训总结

热门文章

  1. 写一个简单易用可扩展vue表单验证插件(vue-validate-easy)
  2. 浪擎全融合灾备云获大数据安全领域最佳创新奖
  3. 解决nginx下connect() to 127.0.0.1:3000 failed
  4. loadrunner如何监控linux,以及重点指标分析
  5. 分享无限:偷拍IBM power 720内部外部图片
  6. linux 下搭建postfix服务器
  7. linux下Java环境的配置
  8. golang fmt.Print(15 == 1_5)
  9. Rem布局的原理解析
  10. Error:The module 'app' is an Android project without build variants, and cannot be built.