代码
public int[] maxSlidingWindow(int[] nums, int k) {
// 考虑数组中只有一个数
if (nums.length == 0 || k == 0) return new int[0];
// 采用双端队列
Deque<Integer> deque = new LinkedList<>();
// 简单分析结果只有nums.length - k + 1个数
int[] res = new int[nums.length - k + 1];
// 先让队列中在k个数形成降序
for (int i = 0; i < k; i++) { // 未形成窗口
// 把队列中,从队尾开始,所有比当前nums[i]的数字抛出
while (!deque.isEmpty() && deque.peekLast() < nums[i])
deque.removeLast();
deque.addLast(nums[i]);
}
System.out.println(deque);
// 第一个k个数中的最大值。
res[0] = deque.peekFirst();
// 然后在剩下的数字中接着
for (int i = k; i < nums.length; i++) { // 形成窗口后
// 如果当前的数字和前面k个数字中最大的数字相等,那么抛出队列中已经有的,当然这边是从头开始
if (deque.peekFirst() == nums[i - k])
deque.removeFirst();
// 这一步是关键,如果队尾数字比双端队列中的数字要大,那么说明
while (!deque.isEmpty() && deque.peekLast() < nums[i])
deque.removeLast();
deque.addLast(nums[i]);
res[i - k + 1] = deque.peekFirst();
}
return res;
}
//作者:jyd
//链接:https://leetcode-cn.com/problems/hua-dong-chuang-kou-de-zui-da-zhi-lcof/solution/mian-shi-ti-59-i-hua-dong-chuang-kou-de-zui-da-1-6/
//来源:力扣(LeetCode)
//著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。