用一个双向队列保存数据,队头保留着当前队列的最大值,每次更新数据的时候需要检查队尾的多个元素是否小于输入的值,队头的元素是否过期。因为队列始终是从大到小排列,所以头部始终保留者最大值。
算法代码;
public static void maxInSlidingWindow(int[] nums, int windowSize){
if(nums.length < windowSize && windowSize >= 1)
return ;
Deque<Integer> queue = new LinkedList<>();
for (int i = 0; i < nums.length; i++) {
while(queue.size()>0&&nums[queue.peekLast()]<=nums[i]){
queue.pollLast();
}
if(queue.size()>0&&(i-queue.peekFirst())>=windowSize){
queue.pollFirst();
}
queue.offerLast(i);
if(i>=(windowSize-1)){
System.out.println(nums[queue.peekFirst()]);
}
}
}
测试代码:
int[] nums = new int[]{2,3,4,2,6,2,5,1};
maxInSlidingWindow(nums, 3);
网友评论