做网站百度关键排名,工信和信息化网站备案系统,qq邮件网站建设的模块,网站开发实训要求原题链接#x1f517;#xff1a;滑动窗口最大值 难度#xff1a;困难⭐️⭐️⭐️
题目
给你一个整数数组 nums#xff0c;有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。
返回 滑动…原题链接滑动窗口最大值 难度困难⭐️⭐️⭐️
题目
给你一个整数数组 nums有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。
返回 滑动窗口中的最大值 。
示例 1 输入nums [1,3,-1,-3,5,3,6,7], k 3 输出[3,3,5,5,6,7] 解释
滑动窗口的位置 最大值
--------------- -----
[1 3 -1] -3 5 3 6 7 31 [3 -1 -3] 5 3 6 7 31 3 [-1 -3 5] 3 6 7 51 3 -1 [-3 5 3] 6 7 51 3 -1 -3 [5 3 6] 7 61 3 -1 -3 5 [3 6 7] 7示例 2 输入nums [1], k 1 输出[1]
提示
1 nums.length 105 -104 nums[i] 104 1 k nums.length
题解
双端队列deque法
题解 初始化创建一个双端队列 deque 来存储窗口内元素的索引。同时创建一个数组 result 来存储窗口的最大值。 遍历数组遍历整数数组 nums对于每个索引 i 维护队列确保队列 deque 的尾部始终是当前窗口内的最大值的索引。这意味着如果队列非空且队列尾部的元素值小于当前元素 nums[i]则从队列尾部移除元素直到队列尾部的元素值大于或等于当前元素或者队列为空。添加索引将当前索引 i 添加到队列尾部。 处理窗口滑动 当索引 i 大于或等于 k 时意味着窗口已经滑动了至少 k 次此时可以确定窗口内的最大值。如果队列头部的索引 deque.front() 等于 i - k这意味着队列头部的元素已经不在当前窗口内因此应该从队列头部移除它。 收集结果将队列头部元素对应的 nums 值添加到结果数组 result 中。 返回结果遍历结束后返回结果数组 result。 复杂度时间复杂度是 O(n)其中 n 是数组 nums 的长度因为每个元素最多被入队和出队一次。空间复杂度是 O(k)因为队列最多包含窗口大小 k 个元素的索引。代码过程 初始化一个双端队列 dq 和一个结果数组 result。遍历数组 nums 中的每个元素。对于每个元素从队列尾部移除所有小于当前元素的索引因为这些索引对应的元素不可能是窗口中的最大值。将当前元素的索引入队。如果队列的长度超过了窗口大小 k则移除队列头部的元素因为它已经不在窗口范围内。当窗口滑动了 k 次之后队列的第一个元素的值就是当前窗口的最大值将其添加到结果数组中。 c demo
#include iostream
#include vector
#include deque
using namespace std;class Solution {
public:vectorint maxSlidingWindow(vectorint nums, int k) {vectorint result;dequeint dq;for (int i 0; i nums.size(); i) {// 移除所有小于当前元素的索引while (!dq.empty() nums[dq.back()] nums[i]) {dq.pop_back();}// 将当前索引入队dq.push_back(i);// 如果队列长度大于窗口大小移除窗口左侧的元素if (dq.front() i - k) {dq.pop_front();}// 当窗口滑动 k 次后队列的第一个元素就是窗口中的最大值if (i k - 1) {result.push_back(nums[dq.front()]);}}return result;}
};int main() {Solution solution;vectorint nums { 1,3,-1,-3,5,3,6,7 };int k 3;vectorint max_values solution.maxSlidingWindow(nums, k);cout Maximum values in the sliding window of size k : ;for (int max_val : max_values) {cout max_val ;}cout endl;return 0;
}输出结果 Maximum values in the sliding window of size 3: 3 3 5 5 6 7