题目描述

题解
// 最大堆法
// 本题和【剑指offer】59. 滑动窗口的最大值 一模一样
// 最大堆法理论上可行,但会超出时间限制。
import java.util.PriorityQueue
class Solution {
public int[] maxSlidingWindow(int[] nums, int size) {
ArrayList<Integer> resList = new ArrayList<>()
PriorityQueue<Integer> maxHeap = new PriorityQueue<>(new Comparator<Integer>(){
@Override
public int compare(Integer o1, Integer o2) {
return o2.compareTo(o1)
}
})
for (int i = 0
maxHeap.offer(nums[i])
}
resList.add(maxHeap.peek())
for (int l = 0, r = size + l
maxHeap.add(nums[r])
maxHeap.remove(nums[l])
resList.add(maxHeap.peek())
}
return arrayToList(resList)
}
public int[] arrayToList(ArrayList<Integer> resList) {
int[] res = new int[resList.size()]
for (int i = 0
res[i] = resList.get(i)
}
return res
}
}
// 简化一下
// 还是通不过,看来这个方法真的太慢,不太行
class Solution {
public int[] maxSlidingWindow(int[] nums, int size) {
int[] res = new int[nums.length - size + 1]
PriorityQueue<Integer> maxHeap = new PriorityQueue<>(new Comparator<Integer>(){
@Override
public int compare(Integer o1, Integer o2) {
return o2.compareTo(o1)
}
})
for (int i = 0
maxHeap.offer(nums[i])
}
res[0] = maxHeap.peek()
for (int l = 0, r = size + l
maxHeap.add(nums[r])
maxHeap.remove(nums[l])
res[r - size + 1] = maxHeap.peek()
}
return res
}
}
class Solution {
public int[] maxSlidingWindow(int[] nums, int size) {
if (size > nums.length || size < 1)
return new int[0];
Deque<Integer> deque = new LinkedList<>();
int[] res = new int[nums.length - size + 1];
for (int i = 0; i < size; i++) {
while (!deque.isEmpty() && deque.peekLast() < nums[i]) {
deque.removeLast();
}
deque.addLast(nums[i]);
}
int j = 0;
if (!deque.isEmpty())
res[j++] = deque.peekFirst();
for (int i = size; i < nums.length; i++) {
if (!deque.isEmpty() && deque.peekFirst() == nums[i - size]) {
deque.removeFirst();
}
while (!deque.isEmpty() && deque.peekLast() < nums[i]) {
deque.removeLast();
}
deque.addLast(nums[i]);
res[j++] = deque.peekFirst();
}
return res;
}
}