返回
图解LeetCode:2379. 得到K个黑块的最少涂色次数(简单)
后端
2024-01-23 18:13:43
一、题目
给你一个长度为 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'
二、题解
本题可以采用贪心算法来解决。
贪心算法是一种在每一步选择当前最优解的算法。在这种情况下,当前最优解是将最长的白色块涂成黑色。
具体步骤如下:
- 从头到尾遍历字符串 blocks。
- 如果遇到白色块,则将计数器 count 加 1。
- 如果遇到黑色块,则将计数器 count 重置为 0。
- 如果计数器 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 个白色块涂成黑色。