Solution 1: 用heap保存对。虽然能通过OJ,但是复杂度并不对
public class Solution { public ArrayList<Integer> maxSlidingWindow(int[] nums, int k) { ArrayList<Integer> res = new ArrayList<Integer>(); if (nums == null || nums.length == 0 || k <= 0) { return res; } PriorityQueue<Pair> heap = new PriorityQueue<Pair>(); for (int i = 0; i < k; i++) { heap.add(new Pair(nums[i], i)); //res.add(heap.peek().val); } for (int i = k; i < nums.length; i++) { res.add(heap.peek().val); Pair toRemove = heap.peek(); while (!heap.isEmpty() && heap.peek().index <= i - k) { heap.remove(); } heap.add(new Pair(nums[i], i)); } res.add(heap.peek().val); return res; } class Pair implements Comparable<Pair> { int val; int index; public Pair(int val, int index) { this.val = val; this.index = index; } @Override public int compareTo(Pair p) { return Integer.compare(p.val, val); } } }
Solution 2: 用double end queue– Deque.将当前元素加在queue的最后,但是加之前把所有比当前值小的元素从后往前删掉,这样就保证了一个按照index顺序维护的降序queue。非常好的思路。
public class Solution { public ArrayList<Integer> maxSlidingWindow(int[] nums, int k) { ArrayList<Integer> res = new ArrayList<Integer>(); if (nums == null || nums.length == 0 || k <= 0) { return res; } Deque<Integer> dQueue = new LinkedList<Integer>(); for (int i = 0; i < k; i++) { while (!dQueue.isEmpty() && nums[dQueue.peekLast()] <= nums[i]) { dQueue.removeLast(); } dQueue.addLast(i); } for (int i = k; i < nums.length; i++) { res.add(nums[dQueue.peekFirst()]); while (!dQueue.isEmpty() && dQueue.peek() <= i - k) { dQueue.removeFirst(); } while (!dQueue.isEmpty() && nums[dQueue.peekLast()] <= nums[i]) { dQueue.removeLast(); } dQueue.addLast(i); } res.add(nums[dQueue.peekFirst()]); return res; } }