参考力扣题解区:
用一个双端队列来充当一个滑动窗口,每次在push进去的时候都保证队首是元素最大的,max()直接拿出队首返回即可。
import java.util.*;
public class Solution {
public ArrayList<Integer> maxInWindows(int [] num, int size)
{
MonotonicQueue window = new MonotonicQueue();
ArrayList<Integer> res = new ArrayList<>();
if(size > num.length || size == 0)
return res;
for(int i = 0; i < num.length; i++){
if(i < size - 1){
window.push(num[i]);
}else{
window.push(num[i]);
res.add(window.max());
//移出旧数字
window.pop(num[i-size+1]);
}
}
return res;
}
}
class MonotonicQueue{
LinkedList<Integer> q = new LinkedList<>();
public void push(int n){
//保持单调递减,队首永远是最大的
while(!q.isEmpty() && q.getLast() < n){
q.pollLast();
}
q.addLast(n);
}
public int max(){
return q.getFirst();
}
public void pop(int n){
if(n == q.getFirst()){
q.pollFirst();
}
}
}也可以用双指针:
import java.util.*;
public class Solution {
public ArrayList<Integer> maxInWindows(int [] num, int size)
{
ArrayList<Integer> res = new ArrayList<>();
if(size > num.length || size == 0 || num.length == 0)
return res;
int l = 0;
int r = size-1;
while(r <= num.length - 1){
int max = num[l];
for(int i = l; i <= r; i++){
if(max < num[i]){
max = num[i];
}
}
res.add(max);
l++;
r++;
}
return res;
}
}
京公网安备 11010502036488号