每日一题——滑动窗口(2)

时间:2021-02-22 12:36:53   收藏:0   阅读:0

滑动窗口(2)

  1. 绝对差不超过限制的最长连续子数组
    给你一个整数数组 nums ,和一个表示限制的整数 limit,请你返回最长连续子数组的长度,该子数组中的任意两个元素之间的绝对差必须小于或者等于 limit 。
    如果不存在满足条件的子数组,则返回 0 。

看到子数组,想到了滑动窗口。
滑动窗口的优点:

本题维护的滑动窗口应该维护“绝对差”小于等于limit的限制,
因此需要维护窗口内的最大值和最小值,并能方便的增加删除特定值的被管理的元素。

std::multiset

看了提示1,推荐使用multiset:

伪代码:

multiset<int> window();  // default Compare: less
for(int l = 0, r = 0; r < nums.size(); ++r)  // sliding window
  window.insert(nums[r]); // r progress
  while( 不是好窗口 )
    l缩进,删除window中的nums[l]
  更新maxLen

单调队列

也可以维护最大最小值的候选队列,当最值被剔除出窗口后能有候选值成为最值。
对队列排序,最值的获取就变得很简单,但元素原本的顺序被打乱,窗口滑动时删除元素额外需要了查找操作。

而单调队列可以解决这个问题:

维护单调队列的关键代码:

while(!maxQue.empty() && maxQue.back() < newCandidate)
  maxQue.pop_back();
maxQue.push_back(newCandidate);
评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!