題目描述:
給出一個(gè)可能包含重復(fù)的整數(shù)數(shù)組,和一個(gè)大小為 k 的滑動(dòng)窗口, 從左到右在數(shù)組中滑動(dòng)這個(gè)窗口偏陪,找到數(shù)組中每個(gè)窗口內(nèi)的最大值抢呆。
樣例:
給出數(shù)組 [1,2,7,7,8], 滑動(dòng)窗口大小為 k = 3. 返回 [7,7,8].
解釋:
最開(kāi)始,窗口的狀態(tài)如下:[|1, 2 ,7| ,7 , 8], 最大值為 7;
然后,窗口向右移動(dòng)一位:[1, |2, 7, 7|, 8], 最大值為 7;
最后,窗口再向右移動(dòng)一位:[1, 2, |7, 7, 8|], 最大值為 8笛谦。
代碼實(shí)現(xiàn):
public class Solution {
/**
* @param nums: A list of integers.
* @return: The maximum number inside the window at each moving.
*/
void inQueue(Deque<Integer> deque, int num) {
while (!deque.isEmpty() && deque.peekLast() < num) {
deque.pollLast();
}
deque.offer(num);
}
void outQueue(Deque<Integer> deque, int num) {
if (deque.peekFirst() == num) {
deque.pollFirst();
}
}
public ArrayList<Integer> maxSlidingWindow(int[] nums, int k) {
ArrayList<Integer> ans = new ArrayList<Integer>();
Deque<Integer> deque = new ArrayDeque<Integer>();
if (nums.length == 0) {
return ans;
}
for (int i = 0; i < k - 1; i++) {
inQueue(deque, nums[i]);
}
for(int i = k - 1; i < nums.length; i++) {
inQueue(deque, nums[i]);
ans.add(deque.peekFirst());
outQueue(deque, nums[i - k + 1]);
}
return ans;
}
}