题目:
https://leetcode-cn.com/problems/sliding-window-maximum/
import java.util.*; public class _239_MaxSlidingWindow { // 优先队列-大根堆 public int[] maxSlidingWindow(int[] nums, int k) { int len = nums.length; int[] ans = new int[len - k + 1]; PriorityQueue<int[]> queue = new PriorityQueue<int[]>(new Comparator<int[]>() { @Override public int compare(int[] o1, int[] o2) { return o1[0] != o2[0] ? o2[0] - o1[0] : o1[1] - o2[1]; } }); for (int i = 0; i < k; i++) { queue.offer(new int[]{nums[i], i}); } for (int i = k; i < len; i++) { ans[i - k] = queue.peek()[0]; while (!queue.isEmpty() && queue.peek()[1] <= i - k) { queue.poll(); } queue.offer(new int[]{nums[i], i}); } ans[len - k] = queue.peek()[0]; return ans; } // 单调栈 public int[] maxSlidingWindow1(int[] nums, int k) { int len = nums.length; Deque<Integer> deque = new LinkedList<>(); int[] ans = new int[len - k + 1]; for (int i = 0; i < k; i++) { while (!deque.isEmpty() && nums[i] >= nums[deque.peekLast()]) { deque.pollLast(); } deque.offerLast(i); } ans[0] = nums[deque.peekFirst()]; for (int i = k; i < len; i++) { while (!deque.isEmpty() && nums[i] >= nums[deque.peekLast()]) { deque.pollLast(); } deque.offerLast(i); while (!deque.isEmpty() && deque.peekFirst() <= i - k) { deque.pollFirst(); } ans[i - k + 1] = nums[deque.peekFirst()]; } return ans; } }