Problem: 2379. 得到 K 个黑块的最少涂色次数
思路
滑动窗口,用一个长度为 k k k 的窗口滑过整个 b l o c k s blocks blocks 数组,每次滑动都更新白色块的数目,保证记录到最小值
解题方法
- 初始化:使用 p , q p,q p,q 左右两个指针指向窗口的两端,让 q q q 滑过 b l o c k s [ 0 ] > − b l o c k s [ k − 1 ] blocks[0]> -blocks[k-1] blocks[0]>−blocks[k−1] 并用 c n t cnt cnt 记录下白色块的数目
- 遍历整个数组,每次都更新 c n t cnt cnt 的值即可
复杂度
-
时间复杂度: O ( n ) O(n) O(n),只有一层循环
-
空间复杂度: O ( 1 ) O(1) O(1), 无额外空间消耗
Code
class Solution {
public int minimumRecolors(String blocks, int k) {
int p = 0, q = 0, cnt = 0;
while(q < k){
cnt += blocks.charAt(q) == 'W' ? 1:0;
q++;
}
int temp = cnt;
while(q < blocks.length()){
temp += blocks.charAt(q++) == 'W' ? 1:0;
temp -= blocks.charAt(p++) == 'W' ? 1:0;
cnt = Math.min(cnt, temp);
}
return cnt;
}
}