1.优先级队列
class Solution {
public int[] maxSlidingWindow(int[] nums, int k) {
int n = nums.length;
int[] ans = new int[n-k+1];
PriorityQueue<int[]> pq = new PriorityQueue<>(new Comparator<int[]>(){
public int compare(int[] o1, int[] o2){
return o2[0] - o1[0];
}
});
for(int i = 0;i < k;i++){
pq.offer(new int[]{nums[i], i});
}
ans[0] = pq.peek()[0];
for(int i = k;i < n;i++){
pq.offer(new int[]{nums[i], i});
while(pq.peek()[1] < i-k+1)
pq.poll();
ans[i-k+1] = pq.peek()[0];
}
return ans;
}
}
2.单调队列(类似于单调栈)
class Solution {
public int[] maxSlidingWindow(int[] nums, int k) {
int n = nums.length;
Deque<Integer> deque = new LinkedList<>();
for(int i = 0;i < k;i++){
while(!deque.isEmpty() && nums[i] > nums[deque.peekLast()]){
deque.pollLast();
}
deque.offerLast(i);
}
int[] ans = new int[n-k+1];
ans[0] = nums[deque.peekFirst()];
for(int i = k;i < n;i++){
while(!deque.isEmpty() && nums[i] > nums[deque.peekLast()]){
deque.pollLast();
}
deque.offerLast(i);
while(deque.peekFirst() < i-k+1){
deque.pollFirst();
}
ans[i-k+1] = nums[deque.peekFirst()];
}
return ans;
}
}
3.