得到 K 个黑块的最少涂色次数【LC2379】
给你一个长度为
n
下标从 0 开始的字符串blocks
,blocks[i]
要么是'W'
要么是'B'
,表示第i
块的颜色。字符'W'
和'B'
分别表示白色和黑色。给你一个整数
k
,表示想要 连续 黑色块的数目。每一次操作中,你可以选择一个白色块将它 涂成 黑色块。
请你返回至少出现 一次 连续
k
个黑色块的 最少 操作次数。
-
思路:
使用一个长度为 k k k的滑动窗口,记录滑动窗口中白色块的数量,即为该滑动窗口中获得连续 k k k个黑色块的操作数,枚举所有的滑动窗口,记录最少操作次数,返回即可
-
实现
class Solution { public int minimumRecolors(String blocks, int k) { int n = blocks.length(); int count = 0; for (int i = 0; i < k; i++){ if (blocks.charAt(i) == 'W'){ count++; } } int min = count; for (int j = 0; j < n - k; j++){ if (blocks.charAt(j) == 'W'){ count--; } if (blocks.charAt(j + k) == 'W'){ count++; } min = Math.min(count, min); } return min; } }
- 复杂度
- 时间复杂度: O ( n ) O(n) O(n)
- 空间复杂度: O ( 1 ) O(1) O(1)
- 复杂度