This will not work for the test case {9, 10, 9, -7, -4, -8, 2, -6} and K = 5
You can remove instead of poll but that would make the time complexity O(nK) which is bad because for large K it could be come O(n^2) which is the same as brute force solution. My suggestion is to use Deque: int n = nums.length; Deque<integer> deque = new LinkedList<>(); int[] result = new int[n - k + 1]; for (int i = 0; i < n; i++) { while (!deque.isEmpty() && deque.peek() < i - k + 1) { deque.pollFirst(); }
while (!deque.isEmpty() && nums[deque.peekLast()] <= nums[i]) { deque.pollLast(); } deque.offer(i);
if (i >= k - 1) { result[i - k + 1] = nums[deque.peekFirst()]; }
This will not work for the test case {9, 10, 9, -7, -4, -8, 2, -6} and K = 5
You can remove instead of poll but that would make the time complexity O(nK) which is bad because for large K it could be come O(n^2) which is the same as brute force solution. My suggestion is to use Deque:
int n = nums.length;
Deque<integer> deque = new LinkedList<>();
int[] result = new int[n - k + 1];
for (int i = 0; i < n; i++) {
while (!deque.isEmpty() && deque.peek() < i - k + 1) {
deque.pollFirst();
}
while (!deque.isEmpty() && nums[deque.peekLast()] <= nums[i]) {
deque.pollLast();
}
deque.offer(i);
if (i >= k - 1) {
result[i - k + 1] = nums[deque.peekFirst()];
}
}
return result;
}