首页 > 其他分享 >【LeetCode 刷题】数组-滑动窗口

【LeetCode 刷题】数组-滑动窗口

时间:2025-01-16 10:58:04浏览次数:3  
标签:cnt right int ans 滑动 刷题 out LeetCode left

此博客为《代码随想录》数组章节的学习笔记,主要内容为滑动窗口知识点的相关题目解析。

文章目录

209.长度最小的子数组

题目链接

class Solution:
    def minSubArrayLen(self, target: int, nums: List[int]) -> int:
        left = curSum = 0
        ans = float('inf')
        for right in range(len(nums)):
            curSum += nums[right]
            while curSum >= target:  # 尽量缩小子数组长度
                ans = min(ans, right - left + 1)
                curSum -= nums[left]
                left += 1
        return ans if ans != float('inf') else 0      
  • 滑动窗口,right 指向终止位置,每次循环都会向后移动一位;left 指向起始位置,动态调整位置。
  • 特点:题目提供的是要满足的条件,求最小长度
    • 在每个循环新的终止位置元素进入窗口后,while 循环尽可能弹出窗口左侧的元素,直到不满足条件。
    • 答案更新放在 while 循环中理解比较直观。(放在循环外也可)

904. 水果成篮

题目链接

class Solution:
    def totalFruit(self, fruits: List[int]) -> int:
        cnt = defaultdict(int)
        left = ans = 0
        for right, in_ in enumerate(fruits):
            cnt[in_] += 1
            while len(cnt) > 2:
                out = fruits[left]
                cnt[out] -= 1
                if cnt[out] == 0:
                    del cnt[out]
                left += 1
            ans = max(ans, right - left + 1)
        return ans
  • defaultdict(int) 创建了一个 defaultdict 对象,其中 int 是一个工厂函数,返回 0。
    • 访问已存在的键时,defaultdict 会返回对应的值。
    • 访问不存在的键时,defaultdict 会调用 int() 函数,返回默认值 0。
  • 特点:特点:题目提供的是要避免的条件,求最大长度
    • 在每个循环新的终止位置元素进入窗口后,while 循环尽可能弹出窗口左侧的元素,直到满足条件。
    • 答案更新放在 while 循环外。

76. 最小覆盖子串

题目链接

class Solution:
    def minWindow(self, s: str, t: str) -> str:
        ans_left = -1
        minLen = float('inf')
        cnt = defaultdict(int)
        for t_ in t:
            cnt[t_] += 1
        less = len(cnt) # 还差几种字符能够满足覆盖
        
        left = 0
        for right, in_ in enumerate(s):
            cnt[in_] -= 1
            if cnt[in_] == 0:
                # 在 in_ 元素移入窗口之后检查
                # 原来 > 0(差字符),现在 = 0(刚好不差)
                less -= 1
            while less == 0:
                if right - left + 1 < minLen:
                    minLen = right - left + 1
                    ans_left = left
                out_ = s[left]
                if cnt[out_] == 0:
                    # 在 out_ 元素移出窗口之前检查
                    # 现在 = 0(刚好不差),移除后 > 0(差字符)
                    less += 1
                cnt[out_] += 1
                left += 1
        return "" if ans_left == -1 else s[ans_left: ans_left + minLen]
  • 优化思路:由于每次移入和移出窗口的都为单个元素,因此在测试是否满足条件时,仅考虑当前变动元素
  • 实现方式:添加 less 变量,用于记录还差几种字符能够满足覆盖(并不是几个)
    • 在字符移入移出时,如果当前字符出现(不差字符)和(差字符)两个状态之间的转换,则更新 less 变量。
    • less == 0 表示所有需要的字符种类均满足,实现覆盖

标签:cnt,right,int,ans,滑动,刷题,out,LeetCode,left
From: https://blog.csdn.net/Bran_Liu/article/details/145153588

相关文章

  • LeetCode 1773. 统计匹配检索规则的物品数量
    在这个问题中,我们被要求统计一个物品数组中满足特定检索规则的物品数量。每个物品由其类型、颜色和名称定义,而检索规则由规则键和规则值指定。我们的任务是找出数组中满足这些规则的物品数量。问题描述解题思路定义索引映射:首先,我们需要定义一个映射,将规则键("type"、"color......
  • LeetCode字符串
    LeetCode字符串LeetCode字符串刷题记录基础知识字符串和数组很相似每个元素的数据类型相同都可以通过下标索引访问字符串比大小从第0个位置开始,依次比较对应位置上的字符编码大小defcompare(str1,str2):i=0j=0whilei<len(str1)andj<len(s......
  • LeetCode题练习与总结:省份数量--547
    一、题目描述有 n 个城市,其中一些彼此相连,另一些没有相连。如果城市 a 与城市 b 直接相连,且城市 b 与城市 c 直接相连,那么城市 a 与城市 c 间接相连。省份 是一组直接或间接相连的城市,组内不含其他没有相连的城市。给你一个 nxn 的矩阵 isConnected ,其......
  • LeetCode题练习与总结:游戏玩法分析 Ⅳ -- 550
    一、题目描述SQLSchema> PandasSchema> Table: Activity+--------------+---------+|ColumnName|Type|+--------------+---------+|player_id|int||device_id|int||event_date|date||games_played|int|+----......
  • LeetCode题练习与总结:移除盒子--546
    一、题目描述给出一些不同颜色的盒子 boxes ,盒子的颜色由不同的正数表示。你将经过若干轮操作去去掉盒子,直到所有的盒子都去掉为止。每一轮你可以移除具有相同颜色的连续 k 个盒子(k >=1),这样一轮之后你将得到 k*k 个积分。返回 你能获得的最大积分和 。示例1:......
  • LeetCode:21.合并两个有序链表
    LeetCode:21.合并两个有序链表解题思路与归并排序中的合并两个有序数组很相似。将数组替换成链表就能解此题。解题步骤新建一个新链表,作为返回结果。用指针遍历两个有序链表,并比较两个链表的当前节点,较小者先接入新链表,并将指针后移一步。链表遍历结束,返回新链表。/***Defini......
  • 210. 课程表 II【 力扣(LeetCode) 】
    文章目录零、原题链接一、题目描述二、测试用例三、解题思路四、参考代码零、原题链接210.课程表II一、题目描述  现在你总共有numCourses门课需要选,记为0到numCourses-1。给你一个数组prerequisites,其中prerequisites[i]=[ai,bi],表示在选修课......
  • LeetCode 2956. 找到两个数组中的公共元素
    在本篇文章中,我们将探讨如何求解LeetCode上的2956.找到两个数组中的公共元素问题。这个问题要求我们找到两个数组中公共元素的出现次数,并分别计算这些公共元素在各自数组中的出现次问题描述 算法分析为了解决这个问题,我们可以采用以下步骤:排序:首先对两个数组进行排......
  • 【Leetcode 每日一题】3066. 超过阈值的最少操作数 II
    问题背景给你一个下标从000开始的整数数组num......
  • 【Leetcode 热题 100】295. 数据流的中位数
    问题背景中位数是有序整数列表中的中间值。如果列表的大小是偶数,则没有中间值,中位数是两个中间值的平均值。例如arr=......