对于滑动窗口问题
class Solution:
def problemName(self, s: str) -> int:
# Step 1: 定义需要维护的变量们 (对于滑动窗口类题目,这些变量通常是最小长度,最大长度,或者哈希表)
x, y = ..., ...
# Step 2: 定义窗口的首尾端 (start, end), 然后滑动窗口
start = 0
for end in range(len(s)):
# Step 3: 更新需要维护的变量, 有的变量需要一个if语句来维护 (比如最大最小长度)
x = new_x
if condition:
y = new_y
'''
------------- 下面是两种情况,读者请根据题意二选1 -------------
'''
# Step 4 - 情况1
# 如果题目的窗口长度固定:用一个if语句判断一下当前窗口长度是否达到了限定长度
# 如果达到了,窗口左指针前移一个单位,从而保证下一次右指针右移时,窗口长度保持不变,
# 左指针移动之前, 先更新Step 1定义的(部分或所有)维护变量
if 窗口长度达到了限定长度:
# 更新 (部分或所有) 维护变量
# 窗口左指针前移一个单位保证下一次右指针右移时窗口长度保持不变
# Step 4 - 情况2
# 如果题目的窗口长度可变: 这个时候一般涉及到窗口是否合法的问题
# 如果当前窗口不合法时, 用一个while去不断移动窗口左指针, 从而剔除非法元素直到窗口再次合法
# 在左指针移动之前更新Step 1定义的(部分或所有)维护变量
while 不合法:
# 更新 (部分或所有) 维护变量
# 不断移动窗口左指针直到窗口再次合法
# Step 5: 返回答案
return ...
""" 给定一个字符串 s ,请你找出其中不含有重复字符的最长子串的长度。 示例: 输入: s = "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。 遍历字符串,当字符串不在哈希表中,将对应的字符增加到 """
class solution_3(object):
def longestSubstrings(self, s:str) -> int:
max_len, hashmap = 0,{}
start = 0
for end in range(len(s)):
hashmap[s[end]] = hashmap.get(s[end], 0) + 1
if end -start + 1 == len(hashmap):
max_len = max(max_len,len(hashmap))
while end - start + 1 > len(hashmap):
head = s[start]
hashmap[head] -= 1
start += 1
if hashmap[head] == 0:
del hashmap[head]
return max_len
"""
给你一个由 n 个元素组成的整数数组 nums 和一个整数 k 。
请你找出平均数最大且 长度为 k 的连续子数组,并输出该最大平均数。
任何误差小于 10-5 的答案都将被视为正确答案。
"""
class solution_4(object):
def maxavgOfSubstrings(self,nums:list,k) -> float:
sum_, max_avg = 0,-math.inf
start = 0
for end in range(len(nums)):
sum_ += nums[end]
while end - start + 1 == k:
max_avg = max(max_avg,sum_/k)
sum_ -= nums[start]
start += 1
return max_avg
def maxavgOfSubstrings_1(self,nums:list,k) -> float:
sum_, max_avg = 0,-math.inf
start = 0
for end in range(len(nums)):
sum_ += nums[end]
if end - start + 1 == k:
max_avg = max(max_avg,sum_/k)
if end >= k-1:
sum_ -= nums[start]
start += 1
return max_avg