<鲁不懂了>一:LeetCode刷题,滑动窗口(定长)

第一幕 滑动窗口与双指针(定长/不定长/单序列/双序列/三指针)


 


前言

        算法是学习人工智能的必修课,从今天开始,在学习别的知识的同时,我还要兼顾算法的学习,我主要使用的刷题网站时LeetCode,跟着里面的灵茶山艾府大佬灵仙的题单后面进行学习,也欢迎大家关注艾仙灵茶山艾府 - 力扣(LeetCode)

        根据题单,我们今天学习的是滑动窗口中的定长问题。


一、例题一:定长子串中元音的最大数目

1.问题重述

        给你字符串 s 和整数 k 。

        请返回字符串 s 中长度为 k 的单个子字符串中可能包含的最大元音字母数。

        英文中的 元音字母 为(aeiou)。

        示例 :

        输入:s = "abciiidef", k = 3
        输出:3
        解释:子字符串 "iii" 包含 3 个元音字母。

2.问题分析

        本问是说在一个字符串中,找到一个为k的子字符串,且这个子字符串中所含的元音字母数是最大的,求这个含最大元音字母数。

3.建立模型求解

(1)放

        首先我们知道,这是一个定长度的问题,长度为k,是题目所给的,所以,我们建立一个有k个格子的框。

        将下标为i的元素放入窗口,然后更新相关量,如本题的相关量就是元音字母数,如果i<k-1,则重复上面放的过程,因为要填满窗口。

(2)更新

        更新数据,如本题是求最大的元音字母数,所以要进行比较,在比较过程中,留下最大的元音字母数。

(3)出

        因为窗口的大小为k,所以,后面的数字进来,前面的就得出去,所以要移除下标为i-k+1的元素。

4.代码求解

class Solution:
    def maxVowels(self, s : str , k : int) -> int
        ans=vowel=0#定义最大元音字母数和元音字母数
        for i , c in enumerate(s):
            if c in "aeiou"
                vowel += 1#判断是否是元音字母
            if i < k-1:
                continue#如果没填满格子,就继续
            ans = max(ans,vowel)#更新最大元音字母数
            if s[i-k+1] in "aeiou"
                vowel -= 1#将第一个移出窗口,还得判断移出的是否是元音字母
        return ans

二、例题二:子数组最大平均数 I

1.问题重述

        给你一个由 n 个元素组成的整数数组 nums 和一个整数 k 。

        请你找出平均数最大且 长度为 k 的连续子数组,并输出该最大平均数。

        任何误差小于 10-5 的答案都将被视为正确答案。

        示例 :

        输入:nums = [1,12,-5,-6,50,3], k = 4
        输出:12.75
        解释:最大平均数 (12-5-6+50)/4 = 51/4 = 12.75

2.问题分析

        本题是在给的一个数组中,要连续的k个元素的平均值最大。求出这个最大的平均值。

3.建立模型求解

        同上

4.代码求解

        

class Solution:
    def findMaxAverage(self , nums : List[int] , k : int) -> float
        ans = 0
        ans = float"-inf"#防止ans是负数
        for i , num in enumerate(nums):
            total += num#放入,求相关值总和
            if i < k-1 :
                continue#放满操作
            ans = max(ans , total / k)#更新数据,找到最大平均值
            total = nums [i-k+1]#移出窗口中的第一个元素
        return ans

三、例题三:大小为 K 且平均值大于等于阈值的子数组数目

1.问题重述

        给你一个整数数组 arr 和两个整数 k 和 threshold 。

        请你返回长度为 k 且平均值大于等于 threshold 的子数组数目。

        示例 :

        输入:arr = [2,2,2,2,5,5,5,8], k = 3, threshold = 4
        输出:3
        解释:子数组 [2,5,5],[5,5,5] 和 [5,5,8] 的平均值分别为 4,5 和 6 。其他长度为 3 的子数组的平均值都小于 4 (threshold 的值)。

2.问题分析

        本题是要我们在一个数组中找到一个长度为k的子数组,其平均值要大于threshold,求满足这个条件的子数组的个数。

3.建立模型求解

        同上

4.代码求解

        

class Solution:
    def numOfSubarrays(self , arr : List[int] , k : int , threshold : int) -> int
        ans = total =0
        for i , c in enumerate(arr):
            total += c
            if i < k - 1:
                continue
            if total >= threshold * k
                ans += 1
            total -= arr[i-k+1]
        return ans

总结

今天学习了滑动窗口的定长问题,刷了三个题,感觉灵仙的方法很nb。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鲁不动AI了

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值