有一个整形数组arr和一个大小为w的窗口从数组的最左边滑到最右边,窗口每次向右边滑一个位置。
例如:数组为[4,3,5,4,3,3,6,7],窗口大小为3时:java
[4,3,5],4,3,3,6,7 5
4,[3,5,4],3,3,6,7 5
4,3,[5,4,3],3,6,7 5
4,3,5,[4,3,3],6,7 4
4,3,5,4,[3,3,6],7 6
4,3,5,4,3,[3,6,7] 7git
使用淘汰劣势元素的方式进行实现,每一个元素有位置和值两个属性,使用队列进行存储,处理原则:github
使用上面的思路进行实现,那么每次移动窗口,队头的元素就是对大的值了。数组
package com.github.zhanyongzhi.interview.algorithm.stacklist; import java.util.ArrayList; import java.util.Deque; import java.util.LinkedList; import java.util.List; /** * 获取各个窗口的最大值 */ public class GetWindowMax { public List<Integer> getWindowMax(Integer[] input, int windowSize) { Deque<Integer> maxIndexQueue = new LinkedList<Integer>(); List<Integer> result = new ArrayList<>(); for (int i = 0; i < input.length; i++) { if(maxIndexQueue.isEmpty()) { maxIndexQueue.push(i); continue; } //移除过时的索引 if(maxIndexQueue.peekFirst() + 3 <= i) maxIndexQueue.removeFirst(); //当前若是是最大的数,则删除前面比其小的数字的索引,不然直接加到最后 Integer lastElement = input[maxIndexQueue.peekLast()]; Integer curElement = input[i]; while(curElement >= lastElement){ maxIndexQueue.removeLast(); if(maxIndexQueue.isEmpty()) break; lastElement = input[maxIndexQueue.peekLast()]; } maxIndexQueue.addLast(i); //索引未够window size,不须要获取最大值 if(i < (windowSize - 1)) continue; //最大值为开头的数字 result.add(input[maxIndexQueue.peekFirst()]); } return result; } }
在github中查看code