一:滑动窗口
滑动窗口分为定长滑动窗口和非定长滑动窗口
定义:滑动窗口的题目一般都是非定长的;一般需要定义两个指针left,right;用来限制窗口的左边界和右边界;
二:LeetCode
209 长度最小的数组
(1)题目:求连续最小的字串和大于目标值的最小长度
(2)思路:定义两个指针;left和right;定义sum表示窗口中的元素的和;min_length表示窗口中满足条件的字串的长度;然后遍历数组;填充窗口中的元素;当窗口中的元素大于目标值的时候;说明需要调整窗口;于是记录当前窗口的长度;然后将窗口左边第一个元素的值删除掉;left指针向前移动一位;继续判断;直至小于目标值的时候说明当前的长度就是满足条件的最小长度;返回mix_length的值;如果不存在直接返回0
def func(nums,target):left=0sum=0min_length=float('inf')for right in range(len(nums)):sum+=nums[right]#填充窗口while sum>=target:#滑动的条件min_length=min(min_length,right-left+1)sum-=nums[left]#弹出左端第一个元素left+=1return min_length if min_length!=float('inf') else 0
1456 定长字符串中元音的最大数目
(1)题目:请返回字符串 s
中长度为 k
的单个子字符串中可能包含的最大元音字母数
(2)思路:首先记录前k的字符中元音字符的数量;然后利用滑动窗口;如果当前的窗口左端的元素为元音字母;那么count-1;入宫窗口的右端的元素为元音字母,count+1;然后取最大的值返回即可
def func(s,k):count=0vowels=('aeiou')for i in range(k):if i in vowels:count+=1max_count=countfor i in range(k,len(s)):if s[i-k] in vowels:count-=1if s[i] in vowels:count+=1max_count=max(max_count,count)return max_count
16 无重复字符串的最长字串
(1)思路:滑动窗口的题目首先需要定义两个指针left,right;right用于遍历字符串;定义max_length用于记录当前字串的长度;
(2)核心:如果窗口右边的元素不在集合中;加入到集合中;如果在集合中;说明左边的元素重复了;于是删除窗口左边的元素并且left指针向右移动;动态调整滑动窗口的大小;最后返回max_length
class Solution:def lengthOfLongestSubstring(self, s: str) -> int:left = 0window = set() # 使用集合来存储窗口中的字符max_length = 0for right in range(len(s)):# 如果当前字符已经在窗口中,移动左指针以缩小窗口while s[right] in window:window.remove(s[left])left += 1# 将当前字符添加到窗口中window.add(s[right])# 更新最大长度max_length = max(max_length, right - left + 1)return max_length
485 最大连续1的个数
class Solution:def findMaxConsecutiveOnes(self, nums: List[int]) -> int:max_count = 0 # 记录最大连续 1 的数量count = 0 # 当前窗口中的连续 1 的数量for num in nums:if num == 1:count += 1max_count = max(max_count, count) # 更新最大值else:count = 0 # 遇到 0 时重置计数器return max_count