209 长度最小的子数组
# 209.长度最小的子数组
# a = []
# for i in range(10):
# a[i] = a.append([])
# for j in range(5):
# a[i][j] = a.append([])
# print(a)
# import numpy as np
#
# test = [[0 for i in range(5)]for j in range(10)]
# a = np.zeros((10,5))
#
# print(test)
# print(a)
# a = [1,2,3,4,5]
# print(a[0:4])
class Solution:
def minSubArrayLen(self, target: int, nums: list[int]) -> int:
left, right, over = 0, 0, float("inf") # 因为这里的over一直在寻找最小值,所以必须将他的初始值设置为最大值
while right < len(nums) and left <= right: # 易错:判断标准是右指针不超过最大长度-1, 左指针小于等于右指针
if sum(nums[left:right+1]) < target: # 看清楚题目的要求
right += 1
else:
over = min(over, right-left+1) # 错误版我就是个傻逼,已经设置了over为0,在一直取最小值的情况下,肯定一直都是0,所以应该设置一个最大值;必须是right-left+1如果用指针指代长度的话
left += 1
return over if over != float("inf") else 0
904 水果成篮
# 904.水果成篮
# 参考
# 连续子序列的问题常常使用滑动窗口来解决,使用双指针(左指针left和右指针right)定义滑动窗口
# class Solution:
# def totalFruit(self, tree) -> int:
#
# left, right = 0, 0 # 左右指针
# basket = dict() # 篮子里的苹果种类及其数量
# fruit_type = 0 # 篮子中的苹果类别数
# res = 0 # 结果
#
# while right < len(tree): # 下标合法时执行
# apple_right = tree[right] # 获取当前苹果
# right += 1 # 右指针右移
#
# if apple_right not in basket: # 只要出现新的苹果种类,更新一下篮子
# basket[apple_right] = 1
# fruit_type += 1
# else: #
# basket[apple_right] += 1
#
# while fruit_type > 2:
# apple_left = tree[left]
# left += 1
# if basket[apple_left] > 0:
# basket[apple_left] -= 1
# if basket[apple_left] == 0:
# del basket[apple_left]
# fruit_type -= 1
#
# res = max(res, right - left)
#
# return res
class Solution:
def totalFruit(self, tree) -> int:
left, right = 0, 0 # 设置滑窗的左右指针
basket = dict() # 设置篮子字典,储存水果类型对应的数量
fruit_type = 0 # 设置水果的种类用来监测
res = 0
while right < len(tree): # 指针合法的时候 and left <= right
fruit_right = tree[right] # 右指针对应到滑窗最右边 # 出错点:tree(right)居然把方括号写成了圆括号!!!!
right += 1 # 右指针往右移一位
if fruit_right not in basket: # 如果右指针对应的水果类型在篮子的字典里面没有 # 注意缩进,所有if都在上一个while下面
basket[fruit_right] = 1 # 那么在篮子的字典里面这个类型的数量就是1
fruit_type += 1 # 水果的类型+1,用来监测有没有超过两种
else: # 如果右指针对应的水果类型在篮子的字典里面已经有了 # elif fruit_right in basket: 易错:这里可以改成elif,但不能是if,if的话就要逐个执行两个if语句了
basket[fruit_right] += 1 # 那么在篮子的字典里面这个类型的数量+1
while fruit_type > 2: # 如果监测到水果的类型出现了第三种
fruit_left = tree[left] # 左指针对应到滑窗最左边
left += 1 # 左指针左移一位
if basket[fruit_left] > 0: # 如果滑窗左面的水果的类型在 篮子字典中超过了0
basket[fruit_left] -= 1 # 该类型数量就-1
if basket[fruit_left] == 0: # 如果滑窗左面的水果类型在 篮子字典中为0 # 易错点:这里是双if结构,执行完第一个if要继续执行后面的if,但是写成elif的话就会跳过这个if了,不执行
del basket[fruit_left] # 删除字典中的该类型
fruit_type -= 1 # 水果类型减1
res = max(res, right-left)
return res
76 最小覆盖子串
未完成