算法刷题-得到 K 个黑块的最少涂色次数

得到 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
    };
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值