【LeetCode刷题记录】239. 滑动窗口最大值

2024-04-12 15:52

本文主要是介绍【LeetCode刷题记录】239. 滑动窗口最大值,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

239 滑动窗口最大值

给你一个整数数组 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 < = n u m s . l e n g t h < = 1 0 5 1 <= nums.length <= 10^5 1<=nums.length<=105
− 1 0 4 < = n u m s [ i ] < = 1 0 4 -10^4 <= nums[i] <= 10^4 104<=nums[i]<=104
1 < = k < = n u m s . l e n g t h 1 <= k <= nums.length 1<=k<=nums.length

思路

本题直接采用暴力法用 vector 存储每次的滑动窗口排序会运行超时,故需要采用单调递减数列进行优化。
一般采用双向队列 deque 实现单调队列。用该单调队列存储每次滑动窗口最大元素的索引值,将 deque 中的头元素与 i − k i-k ik 比较来控制滑动窗口大小,将尾元素与当前索引值对应元素比较大小,只保留较大值来保证单调递减。
PS:deque基本用法(转载自【C++ 十三】C++ deque容器)

  • 插入元素:

push_back(value): 在deque的尾部插入一个元素。
push_front(value): 在deque的头部插入一个元素。

  • 删除元素:

pop_back(): 删除deque的尾部元素。
pop_front(): 删除deque的头部元素。

  • 访问元素:

front(): 返回deque的头部元素的引用。
back(): 返回deque的尾部元素的引用。

  • 判断容器是否为空:

empty(): 如果deque为空,则返回true;否则返回false。

  • 获取容器的大小:

size(): 返回deque中元素的个数。

  • 清空容器:

clear(): 删除deque中的所有元素,使其变为空。

  • 随机访问元素:

at(index): 返回位于指定索引位置的元素的引用,索引从0开始。
operator[](index): 返回位于指定索引位置的元素的引用。

代码

class Solution {
public:vector<int> maxSlidingWindow(vector<int>& nums, int k) {vector<int> v;// 利用双向队列创建单调递减队列,只存储元素索引// 保证滑动窗口内头元素是最大值的索引deque<int> dq;for (int i = 0; i < nums.size(); i++) {// 保证滑动窗口元素数始终等于kif (!dq.empty()  && dq.front() == i - k) {// 删头dq.pop_front();}// 遍历当前队列,保证单调递减while (!dq.empty() && nums[dq.back()] <= nums[i]) {// 删尾dq.pop_back();}dq.push_back(i); // 存储元素索引// 滑动窗口形成,开始存储索引对应值if (i >= k - 1) {v.push_back(nums[dq.front()]);}}return v;}
};

这篇关于【LeetCode刷题记录】239. 滑动窗口最大值的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/897578

相关文章

哈希leetcode-1

目录 1前言 2.例题  2.1两数之和 2.2判断是否互为字符重排 2.3存在重复元素1 2.4存在重复元素2 2.5字母异位词分组 1前言 哈希表主要是适合于快速查找某个元素(O(1)) 当我们要频繁的查找某个元素,第一哈希表O(1),第二,二分O(log n) 一般可以分为语言自带的容器哈希和用数组模拟的简易哈希。 最简单的比如数组模拟字符存储,只要开26个c

Node.js学习记录(二)

目录 一、express 1、初识express 2、安装express 3、创建并启动web服务器 4、监听 GET&POST 请求、响应内容给客户端 5、获取URL中携带的查询参数 6、获取URL中动态参数 7、静态资源托管 二、工具nodemon 三、express路由 1、express中路由 2、路由的匹配 3、路由模块化 4、路由模块添加前缀 四、中间件

leetcode-24Swap Nodes in Pairs

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode swapPairs(L

leetcode-23Merge k Sorted Lists

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode mergeKLists

C++ | Leetcode C++题解之第393题UTF-8编码验证

题目: 题解: class Solution {public:static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num &

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点

C语言 | Leetcode C语言题解之第393题UTF-8编码验证

题目: 题解: static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num & MASK1) == 0) {return

记录每次更新到仓库 —— Git 学习笔记 10

记录每次更新到仓库 文章目录 文件的状态三个区域检查当前文件状态跟踪新文件取消跟踪(un-tracking)文件重新跟踪(re-tracking)文件暂存已修改文件忽略某些文件查看已暂存和未暂存的修改提交更新跳过暂存区删除文件移动文件参考资料 咱们接着很多天以前的 取得Git仓库 这篇文章继续说。 文件的状态 不管是通过哪种方法,现在我们已经有了一个仓库,并从这个仓

使用JS/Jquery获得父窗口的几个方法(笔记)

<pre name="code" class="javascript">取父窗口的元素方法:$(selector, window.parent.document);那么你取父窗口的父窗口的元素就可以用:$(selector, window.parent.parent.document);如题: $(selector, window.top.document);//获得顶级窗口里面的元素 $(

【JavaScript】LeetCode:16-20

文章目录 16 无重复字符的最长字串17 找到字符串中所有字母异位词18 和为K的子数组19 滑动窗口最大值20 最小覆盖字串 16 无重复字符的最长字串 滑动窗口 + 哈希表这里用哈希集合Set()实现。左指针i,右指针j,从头遍历数组,若j指针指向的元素不在set中,则加入该元素,否则更新结果res,删除集合中i指针指向的元素,进入下一轮循环。 /*** @param