滑动窗口_209; 904; 76__leetcode_python

本文介绍了如何使用滑动窗口和双指针技术解决数组中的特定问题,如找到长度最小的子数组使得其元素和大于等于目标值,以及在水果树中保持最多两种水果的最长连续子序列。这两个问题都涉及到动态调整窗口大小以达到目标条件,通过不断移动指针并更新结果,可以有效地找出解决方案。
摘要由CSDN通过智能技术生成

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 最小覆盖子串

未完成

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值