得到 K 个黑块的最少涂色次数
给你一个长度为 n 下标从 0 开始的字符串 blocks ,blocks[i] 要么是 ‘W’ 要么是 ‘B’ ,表示第 i 块的颜色。字符 ‘W’ 和 ‘B’ 分别表示白色和黑色。
给你一个整数 k ,表示想要 连续 黑色块的数目。
每一次操作中,你可以选择一个白色块将它 涂成 黑色块。
请你返回至少出现 一次 连续 k 个黑色块的 最少 操作次数。
-
暴力破解
/** * @param {string} blocks * @param {number} k * @return {number} */ var minimumRecolors = function(blocks, k) { //以长度为K的滑动窗口去遍历blocks,统计长度为k的窗口中W个数最少的情况 let minwcount = 0 //最少W次数 let wcount = 0 //W次数 let arrw = [] //存储wcount的数组 let arr_blocks = Array.from(blocks) //先将字符串转为数组 if(arr_blocks.length == k){//如果k等于字符串本身长度,那就需要遍历一次 for(let i = 0;i<k;i++){ if(arr_blocks[i]=='W'){//找到W,wcount就加1 wcount++ } } return wcount } else{ for(let i = 0;i<arr_blocks.length-k+1;i++){ //窗口移动的次数为,字符串长度-k+1,加1是因为除去剩余的元素,本身窗口也需要查找一次 for(let j = i;j<k+i;j++){ if(arr_blocks[j]=='W'){ wcount++ } } arrw.push(wcount)//内侧循环结束,找到当前遍历的wcount,push进arrw wcount = 0//清0,为下一次遍历准备 } } minwcount = arrw[0] arrw.forEach((item,index)=>{ if(item<minwcount){ minwcount = item } }) //寻找最小值 return minwcount };
-
情况一:outElement与inElement元素相同,则’W’的个数不变。
情况二:outElement=‘W’,inElement=‘B’,则’W’的个数减1。
情况三:outElement=‘B’,inElement=‘W’,则’W’的个数加1。/** * @param {string} blocks * @param {number} k * @return {number} */ var minimumRecolors = function(blocks, k) { //以长度为K的滑动窗口去遍历blocks,统计长度为k的窗口中W个数最少的情况 let minwcount = 0 //最少W次数 let wcount = 0 //W次数 let arrw = [] //存储wcount的数组 let arr_blocks = Array.from(blocks) //先将字符串转为数组 if(arr_blocks.length == k){//如果k等于字符串本身长度,那就需要遍历一次 for(let i = 0;i<k;i++){ if(arr_blocks[i]=='W'){//找到W,wcount就加1 wcount++ } } return wcount } else{ for(let j = 0;j<k;j++){ if(arr_blocks[j]=='W'){ wcount++ } } //先查询一次 arrw.push(wcount) for(let i = 0;i<arr_blocks.length-k;i++){ //窗口移动的次数为,字符串长度-k,窗口就移动剩余元素,在开始时已经查找一次, if(arr_blocks[i] == arr_blocks[k+i]){ //出窗口的元素等于进入的元素 minwcount = wcount //最小保持不变 arrw.push(minwcount) } if(arr_blocks[i]=='B'&&arr_blocks[k+i]=='W'){ //出窗口元素B 入窗口为W minwcount = wcount+1 //统计最少次数 wcount++ //下次迭代判断时的wcount是以此次的wcount为标准 arrw.push(minwcount) } if(arr_blocks[i]=='W'&&arr_blocks[k+i]==='B'){ //出为W,入为B minwcount = wcount-1 wcount-- arrw.push(minwcount) } } } let min = arrw[0] arrw.forEach((item,index)=>{ if(item<min){ min = item } }) //统计出最小值 return min };