题解 | #滑动窗口的最大值#
滑动窗口的最大值
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;
}
}
