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
作者:
Shu-How Z
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文连接,否则保留追究法律责任的权利。