class Solution {
public int[] maxSlidingWindow(int[] nums, int k) {
int n = nums.length;
if (n * k == 0) return new int[0];
if (k == 1) return nums;
Deque<Integer> deque = new ArrayDeque<>();
int[] res = new int[n - k + 1];
int maxIndex = 0;
for (int i = 0; i < n; i++) {
// 检查队列的头部索引是否已经超出当前窗口的范围
if (!deque.isEmpty() && deque.peek() < i - k + 1) {
deque.poll();
}
// 检查队列的尾部索引对应的元素是否小于等于 nums[i]
while (!deque.isEmpty() && nums[deque.peekLast()] < nums[i]) {
deque.pollLast();
}
// 将 i 添加到队列的尾部
deque.offer(i);
// 如果 i 大于等于窗口的大小 k-1,表示窗口已经形成
if (i >= k - 1) {
// 将队列头部的索引对应的元素加入结果列表
res[maxIndex++] = nums[deque.peek()];
}
}
return res;
}
}
class Solution {
public int[] maxSlidingWindow(int[] nums, int k) {
List<Integer> list = new ArrayList<>();
Deque<Integer> dq = new LinkedList<>();//单调队列存储元素的位置
for(int i = 0; i < nums.length; i++){
if(!dq.isEmpty() && i - dq.peekFirst() > k - 1){
dq.pollFirst();
}
while(!dq.isEmpty() && nums[i] > nums[dq.peekLast()]){
dq.pollLast();
}
dq.offerLast(i);
if(i >= k - 1) list.add(nums[dq.peekFirst()]);
}
int[] res = new int[list.size()];
for(int i = 0; i < list.size(); i++){
res[i] = list.get(i);
}
return res;
}
}
共以下 16 个回答
c++ 代码 单调队列 maxSlidingWindow(vector & nums, int k) cc; maxx;
class Solution {
public:
vector
{
vector
deque
for(int i=0;i<nums.size();i++)
{
while(!maxx.empty()&&nums[maxx.back()]<=nums[i])
maxx.pop_back();
maxx.push_back(i);
if(i-kmaxx.front())
maxx.pop_front();
if(i>=k-1)
cc.push_back(nums[maxx.front()]);
}
return cc;
}
};
时间复杂度:O(nlogn)
空间复杂度:O(n)
class Solution { deque =new LinkedList (); //里面记录nums的下标
public int[] maxSlidingWindow(int[] nums, int k) {
//最小队列 单调队列 队列只能单调递减 双端队列
Deque
if(nums.length1) return new int[]{nums[0]};
}
}
写滑动窗口的题目,思路要清晰,细节要考虑到位
以下是代码
但用双指针进行滑动窗口,对于窗口过大的测试用例来说,会超时。
解决方案:加入单调队列来维护。
单调队列经典题目
7.30
Day21:下面是代码