力扣刷题-定长滑动窗口题1

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

给你字符串 s 和整数 k 。

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

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

这道题关于定长滑动窗口,右端移动一个元素时,判断是否时元音字母,是的话累计总和加一,左端移动时,判断是否是元音字母是的话,累计总和减一。

python代码如下:

class Solution:

    def maxVowels(self, s: str, k: int) -> int:

        left = 0

        ans = 0

        for i in range(0, k):

            if s[i] in "aeiou":

                ans += 1

        maxans = ans

        for right in range(k, len(s)):

            if s[right - k] in "aeiou":

                ans -= 1

            if s[right] in "aeiou":

                ans += 1

            maxans = max(maxans, ans)

        return maxans

643子数组最大平均数

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

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

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

class Solution:

    def findMaxAverage(self, nums: List[int], k: int) -> float:

        s2 = 0

        for i in range(0, k):

            s2 += nums[i]

        maxs = s2

        for right in range(len(nums) - k):

            s2 = s2 - nums[right] + nums[right + k]

            if s2 > maxs:

                maxs = s2

        return maxs/k

2379得到K个黑色涂块的最少涂色数

给你一个长度为 n 下标从 0 开始的字符串 blocks ,blocks[i] 要么是 'W' 要么是 'B' ,表示第 i 块的颜色。字符 'W' 和 'B' 分别表示白色和黑色。

给你一个整数 k ,表示想要 连续 黑色块的数目。

每一次操作中,你可以选择一个白色块将它 涂成 黑色块。

请你返回至少出现 一次 连续 k 个黑色块的 最少 操作次数。

这道题定长滑动窗口,右端如果是黑色,总和减一,左端如果是黑色,总和加一

class Solution:

    def minimumRecolors(self, blocks: str, k: int) -> int:

        ans=0

        left=0

        for i in range(0,k):

            if blocks[i]=='W':

                ans+=1

        minans=ans

        for right in range(k,len(blocks)):

            if blocks[right]=='B':

                ans-=1

            if blocks[right-k]=='B':

                ans+=1

            minans=min(minans,ans)

        if minans<0:

           return 0

        return minans

2090半径为k的子数组平均值

给你一个下标从 0 开始的数组 nums ,数组中有 n 个整数,另给你一个整数 k 。

半径为 k 的子数组平均值 是指:nums 中一个以下标 i 为 中心 且 半径 为 k 的子数组中所有元素的平均值,即下标在 i - k 和 i + k 范围( i - k 和 i + k)内所有元素的平均值。如果在下标 i 前或后不足 k 个元素,那么 半径为 k 的子数组平均值 是 -1 。

构建并返回一个长度为 n 的数组 avgs ,其中 avgs[i] 是以下标 i 为中心的子数组的 半径为 k 的子数组平均值 

x 个元素的 平均值 是 x 个元素相加之和除以 x ,此时使用截断式 整数除法 ,即需要去掉结果的小数部分。

class Solution:

    def getAverages(self, nums: List[int], k: int) -> List[int]:

        n = len(nums)

        window_size = 2 * k + 1

        avgs = [-1] * n

        if window_size > n:

            return avgs

        # 使用滑动窗口

        current_sum = sum(nums[:window_size])

        avgs[k] = current_sum // window_size

        for i in range(k + 1, n - k):

            current_sum = current_sum - nums[i - k - 1] + nums[i + k]

            avgs[i] = current_sum // window_size

        return avgs

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值