第五十七题:滑动窗口的最大值

9人阅读 评论(0) 收藏 举报
分类:

滑动窗口的最大值

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

举例说明

例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小,那么一共存在 6 个滑动窗口,它们的最大值分别为{4,4,6,6,6,5}。

解题思路

如果采用蛮力法,这个问题似乎不难解决:可以扫描每一个滑动窗口的所有数字并找出其中的最大值。如果滑动窗口的大小为 k,需要 O(k)时间才能找出滑动窗口里的最大值。对于长度为 n 的输入数组,这个算法总的时间复杂度是 O(nk)。

实际上一个滑动窗口可以看成是一个队列。当窗口滑动时,处于窗口的第一个数字被删除,同时在窗口的末尾添加一个新的数字。这符合队列的先进先出特性。如果能从队列中找出它的最大数,这个问题也就解决了。

在面试题 21 中。我们实现了一个可以用 O(1)时间得到最小值的栈。同样,也可以用 O(1)时间得到栈的最大值。同时在面试题 7 中,我们讨论了如何用两个栈实现一个队列。综合这两个问题的解决方法,我们发现如果把队列用两个栈实现,由于可以用 O(1)时间得到栈中的最大值,那么也就可以用 O(1)时间得到队列的最大值,因此总的时间复杂度也就降到了 O(n)。

我们可以用这个方法来解决问题。不过这样就相当于在一轮面试的时间内要做两个面试题,时间未必够用。再来看看有没有其它的方法。

下面换一种思路。我们并不把滑动窗口的每个数值都存入队列中,而只把有可能成为滑动窗口最大值的数值存入到一个两端开口的队列。接着以输入数字{2,3,4,2,6,2,5,1}为例一步分析。

数组的第一个数字是 2,把它存入队列中。第二个数字是3.由于它比前一个数字 2 大,因此 2不可能成为滑动窗口中的最大值。2 先从队列里删除,再把3存入到队列中。此时队列中只有一个数字 3。针对第三个数字 4 的步骤类似,最终在队列中只剩下一个数字 4。此时滑动窗口中已经有 3 个数字,而它的最大值 4 位于队列的头部。

接下来处理第四个数字 2。2 比队列中的数字 4 小。当 4 滑出窗口之后 2 还是有可能成为滑动窗口的最大值,因此把 2 存入队列的尾部。现在队列中有两个数字 4 和 2,其中最大值 4 仍然位于队列的头部。

下一个数字是 6。由于它比队列中已有的数字 4 和 2 都大,因此这时 4 和 2 已经不可能成为滑动窗口中的最大值。先把 4 和 2 从队列中删除,再把数字 6 存入队列。这个时候最大值 6 仍然位于队列的头部。

第六个数字是 2。由于它比队列中已有的数字 6 小,所以 2 也存入队列的尾部。此时队列中有两个数字,其中最大值 6 位于队列的头部。

接下来的数字是 5。在队列中已有的两个数字 6 和 2 里,2 小于 5,因此 2 不可能是一个滑动窗口的最大值,可以把它从队列的尾部删除。删除数字 2 之后,再把数字 5 存入队列。此时队列里剩下两个数字 6 和 5,其中位于队列头部的是最大值 6。

数组最后一个数字是 1,把 1 存入队列的尾部。注意到位于队列头部的数字 6 是数组的第 5 个数字,此时的滑动窗口已经不包括这个数字了,因此应该把数字 6 从队列删除。那么怎么知道滑动窗口是否包括一个数字?应该在队列里存入数字在数组里的下标,而不是数值。当一个数字的下标与当前处理的数字的下标之差大于或者等于滑动窗口的大小时,这个数字已经从滑动窗口中滑出,可以从队列中删除了。

import java.util.ArrayList;
import java.util.Collections;
import java.util.Arrays;
public class Solution {
    public ArrayList<Integer> maxInWindows(int [] num, int size)
    {
        if(num==null||size<0){
            return null;
        }
        ArrayList<Integer> list=new ArrayList<Integer>();
        if(size==0){
            return list;
        }
        ArrayList<Integer> temp=null;
        int length=num.length;
        if(length<size){
            return list;
        }else{
            for(int i=0;i<length-size+1;i++){
                temp=new ArrayList<Integer>();
                for(int j=i;j<size+i;j++){
                    temp.add(num[j]);
                }
                Collections.sort(temp);
                list.add(temp.get(temp.size()-1));
            }
        }
        return list;
    }
}

查看评论

《剑指offer》滑动窗口的最大值

【 声明:版权所有,转载请标明出处,请勿用于商业用途。  联系信箱:libin493073668@sina.com】 题目链接:http://www.nowcoder.com/p...
  • libin1105
  • libin1105
  • 2015-09-14 13:14:42
  • 1345

面试题72:滑动窗口的最大值

题目: 给定一个数组和滑动窗口的大小,请找出所有滑动窗口里的最大值。 思路: 方法一:暴力法 窗口大小为K,则每次找到一个窗口最大值的时间复杂度为O(K),总时间复杂度:O(NK) 方法二: 仔细观察...
  • tianya_team
  • tianya_team
  • 2016-03-31 10:52:23
  • 1521

面试题65. 滑动窗口的最大值

题目描述给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,...
  • u010429424
  • u010429424
  • 2017-06-24 15:41:37
  • 546

python_lintcode_362. 滑动窗口的最大值

362. 滑动窗口的最大值 题目 给出一个可能包含重复的整数数组,和一个大小为 k 的滑动窗口, 从左到右在数组中滑动这个窗口,找到数组中每个窗口内的最大值。 样例 给出数组 [1,2,7...
  • xiongxu3381
  • xiongxu3381
  • 2018-02-22 19:41:29
  • 118

队列的滑动窗口最大值练习题.

传送门:// 题目描述http://www.nowcoder.com/courses/1/4/8  购买视频请输入优惠码  AdVHxHT 可优惠10元 有一个整型数组 arr 和一个大小...
  • shizheng163
  • shizheng163
  • 2016-03-18 17:45:47
  • 376

剑指Offer面试题65:滑动窗口的最大值 Java实现

题目:给定一个数组和滑动窗口的大小,请找出所有滑动窗口里的最大值。如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4.4,6,6,6,5...
  • gg543012991
  • gg543012991
  • 2016-10-18 23:10:07
  • 2345

滑动窗口的最大值(C++/Java)

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

剑指offer-----滑动窗口的最大值(java版)

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

剑指offer(C++)——滑动窗口的最大值

题目描述 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,...
  • YF_Li123
  • YF_Li123
  • 2017-04-20 11:14:38
  • 935

剑指offer系列之六十三:滑动窗口的最大值

题目描述给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,...
  • u011116672
  • u011116672
  • 2015-12-21 14:23:18
  • 1880
    个人资料
    持之以恒
    等级:
    访问量: 2995
    积分: 571
    排名: 8万+
    文章存档
    最新评论