返回

图解LeetCode:2379. 得到K个黑块的最少涂色次数(简单)

后端

一、题目

给你一个长度为 n 下标从 0 开始的字符串 blocks,blocks[i] 要么是 'W' 要么是 'B',分别表示白色或黑色。

你想要得到 k 个黑块。你有一个可以将白色块涂成黑色的画笔。

你只能涂一个连续的子串。

返回将恰好 k 个白色块涂成黑色所需的最小涂色次数。

 

示例 1:

输入:blocks = "WBBWWBBWBW", k = 7
输出:2
解释:你可以执行以下操作:
- 将下标 2  6 的白色块涂成黑色。
- 将下标 8  9 的白色块涂成黑色。

示例 2:

输入:blocks = "WBWBBW", k = 3
输出:0
解释:不用涂任何颜色,因为已经有 3 个黑块了。

提示:

  • 1 <= n <= 1000
  • blocks[i] 为 'W' 或 'B'

二、题解

本题可以采用贪心算法来解决。

贪心算法是一种在每一步选择当前最优解的算法。在这种情况下,当前最优解是将最长的白色块涂成黑色。

具体步骤如下:

  1. 从头到尾遍历字符串 blocks。
  2. 如果遇到白色块,则将计数器 count 加 1。
  3. 如果遇到黑色块,则将计数器 count 重置为 0。
  4. 如果计数器 count 大于或等于 k,则说明我们找到了一个可以将恰好 k 个白色块涂成黑色的连续子串。将答案 answer 加 1 并将计数器 count 重置为 0。

重复以上步骤,直到遍历完整个字符串 blocks。

三、代码实现

def min_painting_times(blocks, k):
    """
    计算将恰好 k 个白色块涂成黑色所需的最小涂色次数。

    :param blocks: 字符串,表示白色和黑色的块
    :param k: 要涂成黑色的块数
    :return: 最小涂色次数
    """

    # 初始化计数器和答案
    count = 0
    answer = 0

    # 遍历字符串 blocks
    for block in blocks:
        # 如果遇到白色块,则将计数器加 1
        if block == 'W':
            count += 1
        # 如果遇到黑色块,则将计数器重置为 0
        else:
            count = 0

        # 如果计数器大于或等于 k,则说明我们找到了一个可以将恰好 k 个白色块涂成黑色的连续子串
        if count >= k:
            # 将答案加 1 并将计数器重置为 0
            answer += 1
            count = 0

    # 返回答案
    return answer


# 测试代码
blocks = "WBBWWBBWBW"
k = 7
result = min_painting_times(blocks, k)
print(result)  # 输出:2

blocks = "WBWBBW"
k = 3
result = min_painting_times(blocks, k)
print(result)  # 输出:0

四、复杂度分析

  • 时间复杂度:O(n),其中 n 是字符串 blocks 的长度。
  • 空间复杂度:O(1),因为我们只使用了常数个变量。

五、总结

本题是一道简单的贪心算法题。通过贪心算法,我们可以找到最优解,即用最少的涂色次数将恰好 k 个白色块涂成黑色。