对于求解连续的题目,适合用滑动窗口来解决。
例题一:长度最小的子数组
给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组。如果不存在符合条件的连续子数组,返回 0。
输入:s = 7, nums = [2,3,1,2,4,3]
输出: 2
class Solution:
def minSubArrayLen(self, s: int, nums: List[int]) -> int:
# 滑动窗口
res = len(nums)+1
l,total = 0 , 0
for r in range(len(nums)):
total += nums[r]
# 当总和大于s时,l左移,去掉左边的数
while total>=s:
res = min(res,r-l+1)
total -= nums[l]
l += 1
return 0 if res==len(nums)+1 else res
例题二:最长不含重复字符的子字符串
请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。
输入: "abcabcbb" 输出: 3
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
# 滑动窗口
# 初始化头尾指针 left,right;
# right指针右移,判断 right指向的元素是否在 [left:right] 的窗口内;
# 如果窗口中没有该元素,则将该元素加入窗口,同时更新窗口长度最大值,right指针继续右移;
# 如果窗口中存在该元素,则将 left指针右移,直到窗口中不包含该元素。
# 返回窗口长度的最大值。
if len(s)<=1:
return len(s)
res = 1
left,right=0,0
while right<len(s)-1:
right += 1
if s[right] not in s[left:right]:
res = max(res,right-left+1)
else:
while s[left] in s[left:right]:
left+= 1
return res