第一幕 滑动窗口与双指针(定长/不定长/单序列/双序列/三指针)
前言
算法是学习人工智能的必修课,从今天开始,在学习别的知识的同时,我还要兼顾算法的学习,我主要使用的刷题网站时LeetCode,跟着里面的灵茶山艾府大佬灵仙的题单后面进行学习,也欢迎大家关注艾仙灵茶山艾府 - 力扣(LeetCode)。
根据题单,我们今天学习的是滑动窗口中的定长问题。
一、例题一:定长子串中元音的最大数目
1.问题重述
给你字符串 s
和整数 k
。
请返回字符串 s
中长度为 k
的单个子字符串中可能包含的最大元音字母数。
英文中的 元音字母 为(a
, e
, i
, o
, u
)。
示例 :
输入: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。