得到 K 个黑块的最少涂色次数-LeetCode
2379. 得到 K 个黑块的最少涂色次数
🎯 问题描述(来源于LeetCode)
描述:给你一个长度为 n 的二进制字符串 blocks,它由字符 ‘B’(黑)和 ‘W’(白)组成。你需要从中找到一个长度为 k 的子字符串,并将其中所有的 ‘W’ 涂成 ‘B’。请你返回得到一个包含 至少 k 个连续 ‘B’ 的子字符串所需的最少涂色次数。
说明:
- 涂色次数:即子字符串中 ‘W’ 字符的数量。
- 目标:寻找长度为
k的窗口中,‘W’ 数量最少的那个窗口。 - 示例 1:
1 | 输入:blocks = "WBBWWBBWBW", k = 7 |
输入:blocks = “WBWBBBW”, k = 2
输出:0
解释:无需涂色,因为已经有 “BB” 子字符串了。
1 |
|
复杂度验证
- 时间复杂度:O(N)
- 只需要遍历字符串
blocks一次。每个字符被检查一次,滑动窗口的操作是常数时间。
- 只需要遍历字符串
- 空间复杂度:O(1)
- 只使用了
count和count_num等常数个变量,没有使用额外的数组或数据结构。
- 只使用了
思考
- 问题转化:题目要求“最少涂色次数”,本质上就是寻找一个长度为
k的子数组,其中白色块'W'的数量最少。这等价于寻找窗口内元素和(将 W 视为 1,B 视为 0)最小的窗口。 - 初始化陷阱:代码中
count初始化为len(blocks)是安全的,因为最坏情况下(全是 W),最多只需要涂k次,而k一定小于等于len(blocks)。 - 边界处理:
- 代码利用
left < 0跳过了前k-1个元素的判断,确保只有当窗口长度真正达到k时才开始计算最小值。
- 代码利用
- 条件判断:
- 这里只有当
blocks[left]为'W'时才减去count_num,因为如果是 ‘B’,它对涂色次数没有贡献,不需要从计数器中扣除。
- 这里只有当
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 笺札!






