题解 | #滑动窗口的最大值#
滑动窗口的最大值
https://www.nowcoder.com/practice/1624bc35a45c42c0bc17d17fa0cba788
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param num int整型一维数组 * @param size int整型 * @return int整型ArrayList */ public static int[] deque = new int[10000]; public ArrayList<Integer> maxInWindows (int[] num, int size) { // write code here //求滑动窗口的最大值,可以通过单调队列,复杂度是o(n) //双端队列指针,头指针和尾指针 if(size==0||size>num.length) return new ArrayList(); int h=0; int t=0; // 先将size-1个位置的最值安排好 for(int i=0;i<size-1;i++){ while(h<t&&num[deque[t-1]]<=num[i]) t--; deque[t++] = i; } //一共收集结果的个数 int m = num.length-size+1; int[] ans = new int[m]; for(int l=0,r=size-1;r<num.length;l++,r++){ while(h<t&&num[deque[t-1]]<=num[r]) t--; deque[t++] = r; ans[l] = num[deque[h]]; if(deque[h]==l){ h++; } } ArrayList<Integer> list =new ArrayList<>(); for(int i=0;i<ans.length;i++){ list.add(ans[i]); } // ArrayList<Integer> list= new ArrayList(Arrays.asList(ans)) ; return list; } }