LeetCode上面的题目
https://leetcode-cn.com/problems/sliding-window-maximum/
给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口 k 内的数字。滑动窗口每次只向右移动一位。
要求使用O(N)的时间复杂度来解决,使用双端队列来解决,由于操作都是在队头或者队尾,则可以用ArrayList来实现这一功能
其中
list.peekLast() 表示获取队列的最后一个元素
list.peekFirst() 或者 list.peek() 表示获取队列的第一个元素
list.pollLast() 表示弹出队列的最后一个元素
list.poll() 或者 list.pollFirst() 表示弹出队列的第一个元素
解题思路:
处理前 k 个元素,初始化双向队列。
遍历整个数组。在每一步 :
清理双向队列 :
- 只保留当前滑动窗口中有的元素的索引。
- 移除比当前元素小的所有元素,它们不可能是最大的。
将当前元素添加到双向队列中。
将 deque[0] 添加到输出中。
返回输出数组。
代码如下:多练习,多熟悉
package maxSildingWindow;
import java.util.LinkedList;
class Solution {
public int[] maxSlidingWindow(int[] nums, int k) {
if (nums == null || nums.length < 2)
return nums;
//初始化需要用的
LinkedList<Integer> list = new LinkedList();
int[] result = new int[nums.length - k + 1];
for (int i = 0; i < nums.length; i++) {
while (!list.isEmpty() && nums[list.peekLast()] <= nums[i]) {
list.pollLast();
}
list.addLast(i);
if (list.peek() <= i - k) {
list.poll();
}
if(i - k + 1 < 0) continue;
result[i - k + 1] = nums[list.peek()];
}
return result;
}
}