【算法】滑动窗方法问题总结

陆陆续续更了算法总结(一)——LeetCode上一些经典好题原帖也已经记了好多的篇幅了,打算另起一篇,按照题目类型进行总结。
总共需要总结的题目如下:
219. Contains Duplicate II
220. Contains Duplicate III
424. Longest Repeating Character Replacement
340. Longest Substring with At Most K Distinct Characters
3. Longest Substring Without Repeating Characters
30. Substring with Concatenation of All Words
209. Minimum Size Subarray Sum
76. Minimum Window Substring
438. Find All Anagrams in a String

滑动窗方法算是解决数组或者字符串中,处理连续的字符串段应该想到的一种方法,这里面有变长滑动窗,和定长滑动窗。滑动窗问题总共要处理两个方面,一个是新加入点处理和移除滑动窗点点的处理。
现总结一下滑动窗问题的通用型伪代码:

void slidingwindows(vector<int> nums,int k){
    先预处理
    然后进行滑动窗的循环,一般是个while循环,同时实现定义好滑动窗的起点和终点,同时还有一个是记录当前状态的数或者数组,比如count
    int begin = 0, end = 0;
    int count = 0;
    while(end<nums.size()){
        1.在循环里先是当前end到达的时候,更新count
        2.判断更新完后是否满足条件,比如count<k
        3.如果满足的话,可以进行一些处理,如果是求最小长度之类的,会在满足时进行操作
        4.如果不满足的话,也需要进行一些处理,比如求最大长度之类的,会在此时进行操作
        以上3,4条常见的操作就是一个while循环,进行左边界begin的收缩处理,一直到收缩到满足/不满足条件为止
    }
}

子数组中有一个最大限制条件

一般这个最大限制K就是跟滑动窗长度是正相关的。

这类限制条件最常见的是距离

如见下面:
219. Contains Duplicate II数组中找出是否有重复的元素,且重复的元素距离不超过K
220. Contains Duplicate III数组中找出是否有相差的绝对值不超过T的一对元素,且其元素距离不超过K
这两道题用滑动窗用的都比较明显。就是一个定长为K的滑动窗。然后找是否有重复的元素。219这题数据结构可以用multiset或者hashmap,220这道题可以用multiset或者map。

219这题的解法:

    bool containsNearbyDuplicate(vector<int>& nums, int k) {
        unordered_map<int,int> mark;
        for(int i=0;i<nums.size();i++){
            if(i>k)             //处理超出滑动窗的元素
                mark[nums[i-k-1]]--;   
          //注意这里的下标为i-k-1,也可以将这句放在最后面,不过那样的话下标要改成i-k了
            mark[nums[i]]++;
            if(mark[nums[i]]>1)
                return true;
        }
        return false;
    }

220问题的解法:

    bool containsNearbyAlmostDuplicate(vector<int>& nums, int k, int t) {
        multiset<long long int> mark; 
        for (int i = 0; i < nums.size(); i++) {
            if (i > k)
                mark.erase(nums[i-k-1]); 
            auto pos = mark.lower_bound((long long int)nums[i] - t); 
            
  • 6
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值