2379. 得到 K 个黑块的最少涂色次数 Easy
给你一个长度为 n 下标从 0 开始的字符串 blocks ,blocks[i] 要么是 'W' 要么是 'B' ,表示第 i 块的颜色。字符 'W' 和 'B' 分别表示白色和黑色。
给你一个整数 k ,表示想要 连续 黑色块的数目。
每一次操作中,你可以选择一个白色块将它 涂成 黑色块。
请你返回至少出现 一次 连续 k 个黑色块的 最少 操作次数。
示例 1:
输入:blocks = "WBBWWBBWBW", k = 7
输出:3
解释:
一种得到 7 个连续黑色块的方法是把第 0 ,3 和 4 个块涂成黑色。
得到 blocks = "BBBBBBBWBW" 。
可以证明无法用少于 3 次操作得到 7 个连续的黑块。
所以我们返回 3 。
示例 2:
输入:blocks = "WBWBBBW", k = 2
输出:0
解释:
不需要任何操作,因为已经有 2 个连续的黑块。
所以我们返回 0 。
解题思路
输入:一个只包含 'W' 和 'B' 的字符串 blocks,以及一个整数 k
输出:将任意字符变为 'B' 后,获得连续 k 个 'B' 所需的最少操作次数
本题属于固定长度滑动窗口问题。
我们可以使用一个长度为 k 的滑动窗口,在遍历过程中统计当前窗口中 'W' 的数量。因为每个 'W' 都需要通过一次操作变为 'B',所以窗口中 'W' 的数量即为该窗口所需的操作次数。
初始时统计前 k 个字符中的 'W' 数量,然后向右滑动窗口,每次:
- 移出左边字符,如果是 'W',操作次数减一;
- 加入右边字符,如果是 'W',操作次数加一;
- 并在每一步更新最小操作次数。
最终返回整个过程中出现过的最小值即可。
代码实现
python
class Solution:
def minimumRecolors(self, blocks: str, k: int) -> int:
left = 0
white_count = 0 # 当前窗口内 'W' 的数量
# 初始化第一个窗口
for i in range(k):
if blocks[i] == 'W':
white_count += 1
min_ops = white_count # 初始化最小操作次数
# 滑动窗口开始滑动,从第 k 个字符开始
for right in range(k, len(blocks)):
# 如果滑出窗口的是白块,白块数量减 1
if blocks[left] == 'W':
white_count -= 1
# 如果新进入窗口的是白块,白块数量加 1
if blocks[right] == 'W':
white_count += 1
left += 1 # 左指针右移,滑动窗口
# 更新最小操作数
min_ops = min(min_ops, white_count)
return min_ops # 返回最少需要变色的白块数
复杂度分析
时间复杂度:O(n)
空间复杂度:O(1)