1.对于这个问题,事实上使用一个队列记录每一次有可能在滑动窗口中成为最大值数值的索引下标,队列中对首在新增数据的时候表持最大值,当 局部极大值下标与当前处理下标大于 滑动窗口长度,将对首数据出队。
package com.ht.base;
import java.util.ArrayList;
import java.util.LinkedList;
public class MaxWin {
public static void main(String[] args) {
int [] num={2,3,4,2,6,2,5,1};
int ksize=3;
ArrayList<Integer> array=new ArrayList<>();
if(num.length<=0 || num.length<ksize || ksize<=0)
return ;
// 使用队列记录ksize中最大值,将最大值至于队列首部
LinkedList<Integer> queue=new LinkedList<Integer>();
// 得到第一个最大值
for(int i=0;i<ksize ;i++)
{
// 最大值在对首
while(!queue.isEmpty() && num[i]>num[queue.peekLast()])
queue.pollLast();
queue.addLast(i);
}
for(int i=ksize;i<num.length;i++)
{
array.add(num[queue.peekFirst()]);
while(!queue.isEmpty() && num[i]>num[queue.peekLast()])
queue.pollLast();
// 当窗口划出之后可能成为最大值下标保存
queue.addLast(i);
// 判断其是否在窗口中 必须算上自己
if(i-queue.getFirst()+1>ksize)
queue.removeFirst();
}
array.add(num[queue.peekFirst()]);
for(int i=0;i<array.size();i++)
System.out.print(array.get(i));
}
}