方法一暴力解决,方法二使用java的优先队列,维护一个大顶堆,同时判断堆顶的元素是不是在当前窗口内,若不在则移除堆顶直到堆顶位于当前窗口内,此时堆顶元素就是本窗口内的最大值。
import java.util.*;
public class Solution {public ArrayList<Integer> maxInWindows(int [] num, int size) {
ArrayList<Integer> res=new ArrayList<>();
int n=num.length;
if(size>n||size==0){
return res;
}
// int i=0;
// int j=i+size-1;
// while(i<n&&j<n){
// int temMax=Integer.MIN_VALUE;
// for(int k=i;k<=j;k++){
// if(num[k]>=temMax){
// temMax=num[k];
// }
// }
// res.add(temMax);
// i=i+1;
// j=i+size-1;
// }
// return res;
PriorityQueue<int[]> pg=new PriorityQueue<>(new Comparator<int[]>(){
public int compare(int[] a,int[] b){
return b[0]!=a[0]?b[0]-a[0]:b[1]-a[1];}
});
for(int i=0;i<size;i++){
pg.add(new int[]{num[i],i});
}
res.add(pg.peek()[0]);
for(int i=size;i<n;i++){
pg.add(new int[]{num[i],i});
while(pg.peek()[1]<=i-size){
pg.poll();
}
res.add(pg.peek()[0]);
}
return res;
}
}