版权声明:我的GitHub:https://github.com/617076674。真诚求星! https://blog.csdn.net/qq_41231926/article/details/87814755
我的LeetCode代码仓:https://github.com/617076674/LeetCode
原题链接:https://leetcode-cn.com/problems/sliding-window-maximum/description/
题目描述:
知识点:双端队列
思路一:暴力破解法
时间复杂度是O((n - k) * k),其中n为nums数组的长度。
JAVA代码:
public class Solution {
public int[] maxSlidingWindow(int[] nums, int k) {
if (0 == nums.length){
return nums;
}
int[] result = new int[nums.length - k + 1];
for (int i = 0; i < result.length; i++) {
int left = i, right = i + k - 1;
int max = Integer.MIN_VALUE;
for (int j = left; j <= right; j++) {
if (nums[j] > max){
max = nums[j];
}
}
result[i] = max;
}
return result;
}
}
LeetCode解题报告:
思路二:双端队列在线处理
用一个双端队列保存nums数组的索引。遍历nums数组的每一个元素,对其索引值进行入队出队操作。
假设滑动窗口范围是[i - k + 1, i],其中i为nums数组的索引。
(1)如果双端队列不为空,且队首元素的值小于i - k + 1,那么显然该队首元素不在我们的滑动窗口范围内,我们需要令该队首元素出队。
(2)如果双端队列不为空,且nums数组中索引为队尾元素的值小于索引为i的值,那么显然,对后续的最大值求解,nums数组中索引为i位置的值更有可能是[i - k + 1, i]中的最大值,我们可以忽略该队尾元素,于是令该队尾元素出队。
(3)将索引i入队并用nums数组中队首元素的索引位置的值更新result数组的值。
时间复杂度是O(n),其中n为nums数组的长度。空间复杂度是O(k)。
JAVA代码:
public class Solution {
public int[] maxSlidingWindow(int[] nums, int k) {
if (0 == nums.length){
return nums;
}
int[] result = new int[nums.length - k + 1];
int index = 0;
Deque<Integer> deque = new ArrayDeque<>();
for (int i = 0; i < nums.length; i++) {
while (!deque.isEmpty() && deque.peekFirst() < i - k + 1) {
deque.pollFirst();
}
while (!deque.isEmpty() && nums[deque.peekLast()] < nums[i]) {
deque.pollLast();
}
deque.add(i);
if (i >= k - 1) {
result[index++] = nums[deque.peekFirst()];
}
}
return result;
}
}
LeetCode解题报告: