固定长度子数组 + 至少 m 个不同元素:几乎唯一子数组的最大和(LeetCode 2841)

副标题 / 摘要 一道看似麻烦的子数组题:长度必须固定为 k,元素种类又要至少 m 个,还要在满足约束下让子数组和最大。本文通过「固定窗口滑动 + 计数哈希表」,构造 O(n) 级别的简洁算法,并给出多语言实现与工程实践案例。 预计阅读时长:12~15 分钟 适用场景标签:滑动窗口进阶、distinct 计数、子数组最大和 SEO 关键词:almost unique subarray, at least m distinct, sliding window, subarray max sum 目标读者与背景 目标读者 已经掌握基础滑动窗口(如「最长无重复子串」)的刷题同学 后端 / 数据分析工程师,需要在数组或数据流上做实时统计 准备中高级面试,希望写出更工程化解法的开发者 问题背景 / 动机 许多业务都有类似需求: 推荐系统:固定长度的推荐位里,既要保证足够多的不同品类,又希望整体评分尽量高; 监控系统:在最近的固定时间窗口里,要求至少有 m 个不同指标处于活跃状态; 行为分析:在 k 次连续行为中,至少访问 m 个不同页面,且总价值最大。 本题正是这类需求的抽象版,非常适合用来练习滑动窗口 + 计数哈希表的组合技。 A — Algorithm(题目与算法) 题目重述 给定整数数组 nums,正整数 m 和 k。 如果一个长度为 k 的子数组中至少包含 m 个不同的元素,则称其为“几乎唯一子数组(almost unique subarray)”。 请在所有几乎唯一子数组中,找到元素和的最大值;如果不存在这样的子数组,则返回 0。 输入 ...

2025年12月4日 · 9 分钟 · map[name:Jeanphilo]

最少涂色次数拿到 k 个连续黑块:滑动窗口的极简解法(LeetCode 2379)

副标题 / 摘要 一道看似暴力 O(n·k) 的刷题小题,实际只需要一个固定长度滑动窗口就能在 O(n) 内秒杀。本文从题意还原、窗口建模,到多语言实现与工程场景,把这类「固定长度窗口 + 计数」问题一网打尽。 预计阅读时长:8~10 分钟 适用场景标签:滑动窗口、字符串处理、面试刷题 SEO 关键词:LeetCode 2379, minimum recolors, sliding window, k consecutive black blocks 目标读者与背景 目标读者 正在系统刷 LeetCode / 力扣、想提升滑动窗口题目通过率的开发者 面试中经常被「固定窗口 + 计数」卡住的同学 想把算法题思路迁移到业务代码中的后端 / 前端工程师 为什么这个问题值得认真写一篇? 它是滑动窗口最基础的形态:窗口长度固定,维护一个简单计数。 很多更难的题(如「最长连续 1」、「至少 k 个元素」等)都可以退化到这个模板。 工程里也经常遇到类似需求:连续 k 个时间片、连续 k 条日志、连续 k 个卡片槽位是否满足某种条件。 A — Algorithm(题目与算法) 题目描述(用自己的话再说一遍) 给你一个只包含 'W'(白块)和 'B'(黑块)的字符串 blocks,还有一个整数 k。 你可以进行若干次操作,每次操作: 选择一个位置,如果那里是 'W',就可以把它涂成 'B'。 目标是: 通过涂色,让字符串中出现至少一次长度为 k 的连续黑色块(k 个连续 'B'),并且总操作次数最少。问最少要涂几次? 输入 blocks: str,只包含字符 'W' 和 'B' k: int,目标连续黑块长度,1 ≤ k ≤ len(blocks) 输出 ...

2025年12月4日 · 6 分钟 · map[name:Jeanphilo]