当前位置: 首页 > wzjs >正文

学校二级学院网站建设全国疫情突然又严重了

学校二级学院网站建设,全国疫情突然又严重了,网页设计制作方案,上海门户网站建设滑动窗口的最大值 题目描述: 给定一个长度为 n 的数组 num 和滑动窗口的大小 size ,找出所有滑动窗口里数值的最大值。 例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值…

滑动窗口的最大值

题目描述:

给定一个长度为 n 的数组 num 和滑动窗口的大小 size ,找出所有滑动窗口里数值的最大值。

例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}; 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],2,5,1}, {2,3,4,[2,6,2],5,1}, {2,3,4,2,[6,2,5],1}, {2,3,4,2,6,[2,5,1]}。

窗口大于数组长度或窗口长度为0的时候,返回空。

  • 数据范围: 1≤n≤10000,0≤size≤10000,数组中每个元素的值满足
    ∣val∣≤10000
    要求:空间复杂度 O(n),时间复杂度 O(n)

  • 示例1
    输入:[2,3,4,2,6,2,5,1],3
    返回值:[4,4,6,6,6,5]

  • 示例2
    输入:[9,10,9,-7,-3,8,2,-6],5
    返回值:[10,10,9,8]

  • 示例3
    输入:[1,2,3,4],5
    返回值:[]

解题思路

方法一:双端队列(Deque)
  1. 初始化一个空的双端队列和一个空的结果数组。
  2. 遍历数组中的每个元素,对于每个元素:
    • 移除双端队列中不在滑动窗口范围内的元素的索引。
    • 移除双端队列中小于当前元素的元素的索引,因为它们不可能是最大值。
    • 将当前元素的索引添加到双端队列中。
    • 当滑动窗口完全在数组内时,将双端队列首部的元素添加到结果数组中。
  3. 返回结果数组。

方法一JavaScript版本代码如下:

function maxSlidingWindow(nums, size) {if (size <= 0 || size > nums.length) return [];const result = [];const deque = []; // 双端队列,用于存储索引for (let i = 0; i< nums.length; i++) {// 移除不在滑动窗口内的元素的索引while (deque.length && deque[0] < i - size + 1) {deque.shift();}// 移除比当前元素小的元素的索引,因为它们不可能是最大值while (deque.length && nums[deque[deque.length - 1]]< nums[i]) {deque.pop();}// 将当前元素的索引添加到双端队列中deque.push(i);// 当滑动窗口完全在数组内时,将当前窗口的最大值添加到结果中if (i >= size - 1) {result.push(nums[deque[0]]);}}return result;
}// 示例
console.log(maxSlidingWindow([2, 3, 4, 2, 6, 2, 5, 1], 3)); // [4, 4, 6, 6, 6, 5]
console.log(maxSlidingWindow([9, 10, 9, -7, -3, 8, 2, -6], 5)); // [10, 10, 9, 8]
console.log(maxSlidingWindow([1, 2, 3, 4], 5)); // []
方法二:单调递减栈
  1. 初始化一个空的单调递减栈和一个空的结果数组。
  2. 遍历数组中的每个元素,对于每个元素:
    • 弹出栈顶元素,直到栈为空或者栈顶元素小于当前元素。
    • 如果弹出的元素索引对应的窗口已经超出范围,则忽略。
    • 如果栈为空或者栈顶元素对应的窗口正好是当前窗口,则将栈顶元素对应的最大值添加到结果数组中。
    • 将当前元素的索引压入栈中。
  3. 返回结果数组。

方法二JavaScript版本代码:

function maxSlidingWindow(nums, size) {if (size <= 0 || size > nums.length) return [];const result = [];const stack = []; // 单调递减栈,用于存储索引for (let i = 0; i< nums.length; i++) {// 弹出栈顶元素,直到栈为空或者栈顶元素对应的值小于当前元素while (stack.length && nums[stack[stack.length - 1]]< nums[i]) {const index = stack.pop();// 如果弹出的索引对应的窗口已经不在范围内,则跳过if (i - index + 1 > size) {continue;}// 如果栈为空或者栈顶元素对应的窗口在范围内,则将当前最大值加入结果if (stack.length === 0 || i - stack[stack.length - 1] + 1 === size) {result.push(nums[index]);}}// 将当前元素的索引压入栈中stack.push(i);}return result;
}// 示例
console.log(maxSlidingWindow([2, 3, 4, 2, 6, 2, 5, 1], 3)); // [4, 4, 6, 6, 6, 5]
console.log(maxSlidingWindow([9, 10, 9, -7, -3, 8, 2, -6], 5)); // [10, 10, 9, 8]
console.log(maxSlidingWindow([1, 2, 3, 4], 5)); // []

总结与类似题解题思路

解决滑动窗口最大值问题的关键在于维护一个能够快速访问当前窗口最大值的机制。这可以通过以下步骤实现:

  1. 使用双端队列或单调栈来维护一个有序的序列,使得我们可以快速访问最大值。
  2. 在遍历数组的过程中,不断调整这个有序序列,确保它始终反映当前窗口的最大值。
  3. 当窗口滑动时,及时移除不再属于窗口的元素,并添加新进入窗口的元素。
  4. 在窗口完全在数组内时,记录窗口的最大值。

对于类似的滑动窗口问题,如求最小值、求平均值等,都可以采用类似的思路,关键在于如何维护一个能够快速提供所需信息的辅助数据结构。这种方法的时间复杂度通常是O(n),因为我们每个元素最多只会被推入和弹出辅助数据结构一次。

http://www.dtcms.com/wzjs/74318.html

相关文章:

  • 企业做网站需要的资料上海seo公司哪个靠谱
  • 双语网站管理系统 div css国外推广渠道平台
  • 如何再工商局网站做设备抵押百度竞价排名背后的伦理问题
  • 科技布沙发优缺点宁波超值关键词优化
  • 顺义做网站同学软文发稿平台有哪些
  • 新闻资讯建站服务商东莞关键词自动排名
  • nginx设置wordpress伪静态seo自然优化排名
  • 做调查的有哪些网站有哪些网站怎样关键词排名优化
  • 哈尔滨建设银行网站首页数据分析师报考条件
  • 武汉做网站的公司哪家好旺道seo软件技术
  • 亿级流量网站架构怎么创建自己的游戏网站
  • 九江网站设计公司百度手机下载安装
  • 标准北京时间久久网成都网站关键词推广优化
  • 广州白云区做网站网页设计免费模板
  • dw怎样做网站链接广州seo报价
  • 宁波手机网站建设常用的网络营销方法有哪些
  • 宁陵做网站steam交易链接可以随便给别人吗
  • 夏天做啥网站致富百度集团公司简介
  • 微信做单网站今日重庆重要消息
  • 汉滨网站建设搜索引擎优化seo网站
  • 湖南建设工程采购网站seo顾问阿亮博客
  • 江西省城市建设档案馆网站百度seo优化按年收费
  • 软件wap网站福州seo服务
  • 在哪做网站好搜索引擎营销的案例
  • 校园二手市场网站建设方案足球比赛今日最新推荐
  • wordpress如何显示文章列表杭州百度快照优化排名
  • 网站怎么加ico百度公司招聘
  • 网站的第二域名怎么用网络营销方案模板
  • 网站建设 图片问题百度商家平台客服电话
  • 什么样的网站开发比较吃香软文推广多少钱