public class Solution {
public static int[] maxSlidingWindow(int[] nums, int k)
{
//这是装答案的数组
int[]result=new int[nums.length-k+1];
//双端队列中放入的是数组的下标
Deque<Integer>dq=new LinkedList<>();
//将前k-1个数更新进双端列中
for(int i=0,j=0;j<k-1;j++)
{
UpdateTheQueue(nums,i,j,dq);
}
//开始正式迭代
for(int i=0,j=k-1;j<nums.length;i++,j++)
{
UpdateTheQueue(nums,i,j,dq);
result[i]=nums[dq.peekFirst()];
}
return result;
}
public static void UpdateTheQueue(int[]nums,int l,int r,Deque<Integer>dq)
{
//这里的具体做法是,如果新进的数比队尾的数大就把队尾的数丢弃,直到队列为空或者队尾的数比新进的数大
while(dq.size()!=0&&nums[dq.peekLast()]<nums[r])
{
dq.pollLast();
}
//将新进的数加进队尾
dq.addLast(r);
//如果队首的数已经在滑动窗口之外,则出队
if(dq.peekFirst()<l)
{
dq.pollFirst();
}
}
public static void main(String[] args) {
int[]nums= {1,-1};
int k=1;
int[]result=maxSlidingWindow(nums,k);
for(int x:result)
{
System.out.print(x+" ");
}
}
}