LeetCode算法—滑动窗口

一:滑动窗口

滑动窗口分为定长滑动窗口和非定长滑动窗口

定义:滑动窗口的题目一般都是非定长的;一般需要定义两个指针left,right;用来限制窗口的左边界和右边界;


二:LeetCode

209 长度最小的数组

(1)题目:求连续最小的字串和大于目标值的最小长度

(2)思路:定义两个指针;left和right;定义sum表示窗口中的元素的和;min_length表示窗口中满足条件的字串的长度;然后遍历数组;填充窗口中的元素;当窗口中的元素大于目标值的时候;说明需要调整窗口;于是记录当前窗口的长度;然后将窗口左边第一个元素的值删除掉;left指针向前移动一位;继续判断;直至小于目标值的时候说明当前的长度就是满足条件的最小长度;返回mix_length的值;如果不存在直接返回0

def func(nums,target):
    left=0
    sum=0
    min_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+=1
    return min_length if min_length!=float('inf') else 0

1456 定长字符串中元音的最大数目

(1)题目:请返回字符串 s 中长度为 k 的单个子字符串中可能包含的最大元音字母数

(2)思路:首先记录前k的字符中元音字符的数量;然后利用滑动窗口;如果当前的窗口左端的元素为元音字母;那么count-1;入宫窗口的右端的元素为元音字母,count+1;然后取最大的值返回即可

def func(s,k):
    count=0
    vowels=('aeiou')
    for i in range(k):
        if i in vowels:
            count+=1
    max_count=count
    for i in range(k,len(s)):
        if s[i-k] in vowels:
            count-=1
        if s[i] in vowels:
            count+=1
        max_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 = 0
        window = set()  # 使用集合来存储窗口中的字符
        max_length = 0
        for 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 += 1
                max_count = max(max_count, count)  # 更新最大值
            else:
                count = 0  # 遇到 0 时重置计数器
        return max_count
posted @ 2024-09-11 21:29  Gsupl.落浅~  阅读(19)  评论(0编辑  收藏  举报