滑动窗口最大值
如果不用数据结构,用双指针也可以解决,那要用数据结构的话,用什么类型的数据结构呢?使用单调队列
正解:
class MyQueue{
// 创建一个单调递减的队列
Deque<Integer> deque=new LinkedList<>();
//弹出元素时,要保证该元素是最大值且队列不为空
void poll(int value){
if(!deque.isEmpty() && value==deque.peek()){
deque.poll();
}
}
//添加元素时,保证该元素比末尾的元素值大
void add(int value){
while(!deque.isEmpty() && value>deque.getLast()){
deque.removeLast();
}
deque.add(value);
}
int peek(){
return deque.peek();
}
}
class Solution {
public int[] maxSlidingWindow(int[] nums, int k) {
if(nums.length ==1)
return nums;
//必须初始化大小
int[] res=new int[nums.length-k+1];
int index=0;
//自定义队列
MyQueue myQueue=new MyQueue();
//将第一扇窗口里面的数字放入队列
for(int i=0;i<k;i++){
myQueue.add(nums[i]);
}
res[index++]=myQueue.peek();//这里就存放了第一个最大值
for(int i=k;i<nums.length;i++){
//如果能移除最前面的,说明最后面的新元素可以加入,这样就能保证每次队列里面都有三个数参与过,只是有些数因为不满足条件而未被写进去.
myQueue.poll(nums[i-k]);
myQueue.add(nums[i]);
res[index++]=myQueue.peek();
}
return res;
}
}