题解 | #滑动窗口的最大值#
滑动窗口的最大值
https://www.nowcoder.com/practice/1624bc35a45c42c0bc17d17fa0cba788
方法:记录每次滑动窗口的最大值,判断每次滑动前后移除的首元素是不是最大值元素,以及加入的最后一个元素是不是新的最大值元素,异常情况用快速排序找窗口中的最大值:
import java.util.*;
public class Solution {
public ArrayList<Integer> maxInWindows(int [] num, int size) {
Deque<Integer>deque=new LinkedList<>();
int arrlength=num.length-size+1;
ArrayList<Integer>a=new ArrayList<>(arrlength);
Integer[]temp=new Integer[size];
int []temp2=new int [size];
//当前窗口最小值
int max=-999999;
//前size个元素先入队尾
for(int i=0;i<size;i++){
deque.offerLast(num[i]);
if(num[i]>max)
max=num[i];
}
a.add(max);
System.out.println(arrlength);
//针对窗口数的循环
for(int i=1;i<arrlength;i++){
//扫描流程
//每到一个元素将该元素加入到队尾,并比较它和min的大小,
//如果小就修改min,并加入结果ArrayList;
//然后将第一个元素出队,并比较它与min是否相同:
//不同,该元素非最小元素,继续执行
//相同,需要重新对deque进行排序,这里采用快排序
deque.offerLast(num[size-1+i]);
if(num[size-1+i]>max){
max=num[size-1+i];
a.add(max);
deque.pollFirst();
}else{
int f=deque.pollFirst();
if(f==max){
deque.toArray(temp);
for(int j=0;j<size;j++)
temp2[j]=temp[j];
quicksort(temp2,0,size-1);
max=temp2[size-1];
}
a.add(max);
}
}
return a;
}
public void quicksort(int []a,int s,int e){
if(s>=e)return ;
int pivot=(int)(s+Math.random()*(e-s+1));
int temp=a[s];
a[s]=a[pivot];
a[pivot]=temp;
int base=a[s];
int l=s,h=e;
while(l<h){
while(l<h&&a[h]>=base)
h--;
a[l]=a[h];
while(l<h&&a[l]<=base)
l++;
a[h]=a[l];
}
a[l]=base;
if(l==a.length-1)
return ;
else
quicksort(a,l+1,e);
}
}

