双指针向右滑动,然后遍历比较找出滑动窗口里面的最大值
public ArrayList<Integer> maxInWindows(int [] num, int size)
{
ArrayList<Integer> res = new ArrayList<>();
if(num.length < size || num.length == 0 || size < 1)
return res;
int l = 0;
int r = size-1;
while(r <= num.length-1){
int max = num[l];
for(int i = l; i <= r; i++){
if(max < num[i])
max = num[i];
}
res.add(max);
l++;
r++;
}
return res;
}
借助一个大顶堆,存储滑动窗口的元素,然后取堆顶的数即为滑动窗口的最大值,然后滑动窗口往下滑一个位置
public ArrayList<Integer> maxInWindows(int [] num, int size)
{
PriorityQueue<Integer> maxQueue = new PriorityQueue<Integer>((o1,o2)->o2-o1); // 大顶堆
ArrayList<Integer> res = new ArrayList<>();
if(num.length < size || num.length == 0 || size < 1)
return res;
int index = 0;
for(;index < size; index++) // 先初始化第一个滑动窗口
maxQueue.add(num[index]);
while(index < num.length){ //当滑到最后一个时
res.add(maxQueue.peek()); //堆顶即为最大
maxQueue.remove(num[index-size]); //移除掉滑动窗口第一个元素
maxQueue.add(num[index]); //加进去当前位置的元素
index++;
}
res.add(maxQueue.peek()); // 最后一个没放进去
return res;
} 
京公网安备 11010502036488号