欢迎光临散文网 会员登陆 & 注册

567. 992. | 滑动窗口题型

2020-04-25 15:30 作者:有木乘舟  | 我要投稿


分析:

  比较典型的判断一个字符串是否是另一个字符串的子串的问题。

  这题最直接的思路就是移动窗口,每移动一次对窗口内的字符串进行判断,是否是第一个字符串的排列。

  我们使用两个哈希表存储字符串s1和s2的窗口,每次只要比较两个哈希表是否相等即可。

  注意,题目并没有说s1一定小于等于s2,所以我们需要有一个判断 s1 > s2 ,是的话直接返回false。

567.代码

分析:

  题目求的是数组中满足不同整数为K个的连续子数组的个数。

  可见,窗口大小为K到A.size(),最直接的解法也就是暴力解法,我们从窗口K开始,K=A.size()结束,依次遍历整个数组,计算全部子数组是否符合条件。

  暴力解法超时的原因大多数都是因为大量重复计算,所以我们优化的方向就是尽可能的将重复的部分给剔除掉。

  我们观察发现,如果先将right指针向右移动,然后再将left指针右移,依次对当前窗口K里面的子数组进行遍历计算,会大大的减少重复计算量。

  总结归纳为以下两个要点:

  • 对当前窗口,若新加入元素后,不重复数字大于K,则缩小窗口大小,即 left++,right不变

  • 对当前窗口,若新加入元素后,不重复数字等于K,则计算当前窗口好子数组的数量,并在计算结束后恢复窗口数据

  由于我们每次都是在加入新元素后才计算,所以不会重复计算之前已经算过的好子数组数量,这样可以大大减少计算量,将时间复杂度降低。

  图解:

  注意,我们在移动计算好子数组的时候,哈希表只是作为临时计算用的,在计算完之后一定要恢复数据。

    最后膜拜一下大神的解法:


567. 992. | 滑动窗口题型的评论 (共 条)

分享到微博请遵守国家法律