Description
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]
.
Thinking Process
- Use a max heap to keep track of the sliding window
Code
public int[] maxSlidingWindow(int[] nums, int k) {
if (nums == null || k <= 0) {
return new int[0];
}
PriorityQueue<Integer> window = new PriorityQueue<>(new Comparator<Integer>() {
public int compare(Integer c1, Integer c2) {
if(c1 > c2){
return -1;
}
if(c1 < c2){
return 1;
}else{return 0;}
}
});
int[] max = new int[nums.length - k + 1];
for(int i = 0; i < nums.length; i++){
if(i < k - 1){
window.offer(nums[i]);
}else{
window.offer(nums[i]);
max[i - k + 1] = window.peek();
window.remove(nums[i - k + 1]);
}
}
return max;
}
Complexity
- Time complexity is O(nlogn)