滑动窗口
滑动窗口通常用于数组或链表题目中,作为暴力解法的优化,可以理解为双指针的一种。
- 窗口内的元素代表着什么?
- 如何移动窗口的起始位置,终止位置?
经典题目:
3.1 长度最小的子数组(209)
class Solution:
def minSubArrayLen(self, target: int, nums: List[int]) -> int:
n = len(nums)
i = 0
sum = 0
res = float("inf")
for j in range(n):
sum +=nums[j]
while sum >= target:
res = min(res, j-i+1)
sum -= nums[i]
i += 1
return 0 if res == float("inf") else res
3.2 水果成篮(904)
class Solution:
def totalFruit(self, fruits: List[int]) -> int:
n = len(fruits)
hashT = defaultdict(int)
res = 0
i = 0
for j in range(n):
hashT[fruits[j]] += 1
while sum(k>=1 for k in hashT.values())>2:
res = max(res, j-i)
hashT[fruits[i]] -= 1
if hashT[fruits[i]] == 0:
hashT.pop(fruits[i])
i+=1
res = max(res, j-i+1)
return res
3.3 最小覆盖子串
class Solution:
def minWindow(self, s: str, t: str) -> str:
m, n = len(s), len(t)
hashT = defaultdict(int)
hashT2 = {}
for i in range(n):
hashT[t[i]] += 1
i=0
for j in range(m):
if s[j] in hashT:
hashT[s[j]] -= 1
while sum(k<=0 for k in hashT.values() ) == len(hashT):
if s[i] in hashT:
hashT[s[i]] += 1
hashT2[j-i+1] = s[i:j+1]
i+=1
return hashT2[min(hashT2.keys())] if hashT2 else ""