Skip to content

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)

链接

2379 国际版

2379 中文版