双指针向右滑动,然后遍历比较找出滑动窗口里面的最大值
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; }