239. 滑动窗口最大值
解题思路
- 计算每一个滑动窗口的最大值 关键在于借助单调队列实现窗口
- 对于单调队列 尾部添加元素 头部删除元素
- 添加元素操作:从尾部开始循环对比 删除比当前元素小的元素
- 获取最大值元素 直接获取头部元素
- 删除元素操作 直接删除头部元素
class Solution {
public int[] maxSlidingWindow(int[] nums, int k) {
MonotonicQueue window = new MonotonicQueue();
List<Integer> res = new ArrayList<>();
for(int i = 0; i < nums.length; i++){
if(i < k - 1){
window.push(nums[i]);
}else{
window.push(nums[i]);
res.add(window.max());
window.pop(nums[i - k + 1]);
}
}
int[] arr = new int[res.size()];
for(int i = 0; i < res.size(); i++){
arr[i] = res.get(i);
}
return arr;
}
class MonotonicQueue{
private LinkedList<Integer> maxq = new LinkedList<>();
public void push(int n){
while(!maxq.isEmpty() && maxq.getLast() < n){
maxq.pollLast();
}
maxq.addLast(n);
}
public int max(){
return maxq.getFirst();
}
public void pop(int n){
if(n == maxq.getFirst()){
maxq.pollFirst();
}
}
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62