Q65:滑动窗口的最大值

原创 2016年08月31日 11:20:43
import java.util.ArrayList;
import java.util.Deque;
import java.util.LinkedList;
public class Q65滑动窗口的最大值 {
	/**
	 * 题目:滑动窗口的最大值
	 * 题目说明:给定一个数组和滑动窗口的大小,请找出所有滑动窗口里的最大值。例如输入数组 {2,3,4,2,6,2,5,1}以及滑动窗口的
	 *        大小,那么一共存在6个滑动窗口,它们的最大值分别为{4;4;6;6;6;5}。
	 * 解题思路:把数组中可能成为滑动窗口的最大的数值存入到一个两头开口的队列中。在队列中存入的是数字在队列中的下标,而不是数值。当一个数字的下标与
	 * 当前处理的数字的下标之差大于或者等于滑动窗口的大小时,这个数字已经从窗口中滑出,可以从队列中删除了。
	 */
	public static void main(String[] args) {
        int num[] = {2,3,4,2,6,2,5,1};  
        ArrayList<Integer> list = maxInWindows(num,3);  
        for(int i:list){  
            System.out.print(i + ";");  
        }
	}
	public static ArrayList<Integer> maxInWindows(int[] num, int size)//size是窗口的大小
    {  
        ArrayList<Integer> Window_max = new ArrayList<Integer>();//保存每个窗口中的最大值数组
        Deque<Integer> deque = new LinkedList<Integer>();//创建一个——“双向队列”
        
        for(int i = 0; i < size; i++){//先把当前空窗口填满,填满以后,deque中存放了窗口中的最大数 
            while(!deque.isEmpty() && num[i] >= num[deque.getLast()]){  
            	deque.removeLast();
            }  
            deque.addLast(i);//在队列的尾部添加最大值的下标  i
        }  
        
        for(int i = size; i < num.length; i++){//窗口填满以后开始向右移动窗口
            
        	Window_max.add(num[deque.getFirst()]);//窗口中添加新元素前,要保存当前窗口的最大值
            //然后窗口滑动一步,比较num[i]和deque中下标对应的数,deque中First对应的数字是当前最大值
            while(!deque.isEmpty() && num[i] >= num[deque.getLast()]){  
            	deque.removeLast();
            }  
            
            if(!deque.isEmpty() && deque.getFirst()<=(i-size))//另外,需要删除已经不在当前窗口的数字对应的下标  
            	deque.removeFirst();  
            
            deque.addLast(i);//把需要添加最新的数字进deque队列 。 这样就能保证当前窗口中最大的值为deque的First。
        }  
        //把最后一个窗口的最大值加入Window_max中。
        Window_max.add(num[deque.getFirst()]);
        return Window_max;  
   }
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

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

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

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

题目描述给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,...
  • u011116672
  • u011116672
  • 2015年12月21日 14:23
  • 1661

65 - 滑动窗口的最大值

给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,...
  • quzhongxin
  • quzhongxin
  • 2015年08月03日 09:28
  • 1753

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

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

剑指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
  • 1883

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

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

剑指Offer--065-滑动窗口的最大值

链接 牛客OJ:滑动窗口的最大值 九度OJ:未收录 GitHub代码: 065-滑动窗口的最大值 CSDN题解:剑指Offer–065-滑动窗口的最大值 牛客OJ ...
  • gatieme
  • gatieme
  • 2016年07月15日 10:58
  • 2671

剑指offer——滑动窗口的最大值

题目描述: 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4...
  • sbq63683210
  • sbq63683210
  • 2016年06月18日 22:47
  • 651

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

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

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

slideMaxWindow.html                           --> //采用双队列的方法,可以只需检查一遍,即可完成所有最大窗口的提取。...
  • zyzn1425077119
  • zyzn1425077119
  • 2016年01月31日 07:47
  • 1258
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Q65:滑动窗口的最大值
举报原因:
原因补充:

(最多只允许输入30个字)