描述
滑动窗口最大值239
分析
实现
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
| import java.util.Deque; import java.util.LinkedList;
public class SlidingWindowMaximum239 { public static void main(String[] args){ int[] arr = {1,3,-1,-3,3,3,6,7}; int k = 3; for (int item : new Solution().maxSlidingWindow(arr,k)) { System.out.print(item + "\t"); } } }
class Solution { public int[] maxSlidingWindow(int[] nums, int k) { if (nums.length == 1){ return nums; } MyQueue myQueue = new MyQueue(); int len = nums.length - k + 1; int[] res = new int[len]; int temp = 0;
for (int i = 0; i < k; i++) { myQueue.add(nums[i]); } res[temp++] = myQueue.peek();
for (int j = k; j < nums.length; j++) { myQueue.poll(nums[j - k]); myQueue.add(nums[j]); res[temp++] = myQueue.peek(); } return res;
} }
class MyQueue { Deque<Integer> deque = new LinkedList<>();
void poll(int num){ if (!deque.isEmpty() && deque.peek() == num) { deque.poll(); } } void add(int num){ while(!deque.isEmpty() && num > deque.getLast()) deque.removeLast(); deque.add(num); } int peek(){ return deque.peek(); } }
|
总结
主要是一个思想,你领悟到了没有?
队列没有必要维护窗口里的所有元素,只需要维护有可能成为窗口里最大值的元素就可以了,同时保证队列里的元素数值是由大到小的。
单调队列,即单调递减或单调递增的队列。