239. Sliding Window Maximum
Given an array nums, there is a sliding window of size k which is moving from the very left of the array to the very right. You can only see the k numbers in the window. Each time the sliding window moves right by one position.
For example,
Given nums = [1,3,-1,-3,5,3,6,7]
, and k = 3.
Window position Max --------------- ----- [1 3 -1] -3 5 3 6 7 3 1 [3 -1 -3] 5 3 6 7 3 1 3 [-1 -3 5] 3 6 7 5 1 3 -1 [-3 5 3] 6 7 5 1 3 -1 -3 [5 3 6] 7 6 1 3 -1 -3 5 [3 6 7] 7
Therefore, return the max sliding window as [3,3,5,5,6,7]
.
Note:
You may assume k is always valid, ie: 1 ≤ k ≤ input array's size for non-empty array.
Follow up:
Could you solve it in linear time?
Similar:
76. Minimum Window Substring
155. Min Stack
159. Longest Substring with At Most Two Distinct Characters
265. Paint House II
1 Solution 1. Priority Queue 2 public class Solution { 3 class Pair implements Comparable<Pair>{ 4 public int key; 5 public int idx; 6 7 public Pair(int k, int id) { 8 this.key = k; 9 this.idx = id; 10 } 11 12 @Override 13 public int compareTo(Pair p) { 14 return this.key < p.key ? 1 : (this.key == p.key ? 0 : -1); // reverse order, from Large to Small 15 } 16 } 17 18 public int[] maxSlidingWindow(int[] nums, int k) { 19 if (nums.length == 0 || k <= 0) return new int[0]; 20 21 PriorityQueue<Pair> que = new PriorityQueue<Pair>(); 22 int[] ret = new int[nums.length - k + 1]; 23 int i = 0; 24 25 for (i = 0; i < nums.length; i++) { 26 que.add(new Pair(nums[i], i)); 27 while (que.peek().idx < i - k + 1) { 28 que.poll(); 29 } 30 if (i >= k-1) { 31 ret[i-k+1] = que.peek().key; 32 } 33 } 34 35 return ret; 36 } 37 }