[杨小白]_leetcode_第85场双周赛-第一题2379. 得到 K 个黑块的最少涂色次数

182 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第30天,点击查看活动详情

前言

小白算法比较菜,希望能激励我每日更新,从leetcode第一题开始,2022年目标300题,记录从0到1的全过程!!

第85场双周赛-力扣

第85场双周赛-力扣

啊真是服了,1,2题合起来十分钟就ac了,第三题一直超时,也意识到问题了,最后想到了解决方法,做完提交的时候已经12点01了,差点三题选手。

2379. 得到 K 个黑块的最少涂色次数

给你一个长度为 n 下标从 0 开始的字符串 blocks ,blocks[i] 要么是 'W' 要么是 'B' ,表示第 i 块的颜色。字符 'W' 和 'B' 分别表示白色和黑色。

给你一个整数 k ,表示想要 连续 黑色块的数目。

每一次操作中,你可以选择一个白色块将它 涂成 黑色块。

请你返回至少出现 一次 连续 k 个黑色块的 最少 操作次数。

示例 1

输入:blocks = "WBBWWBBWBW", k = 7

输出:3

解释:

  • 一种得到 7 个连续黑色块的方法是把第 0 ,3 和 4 个块涂成黑色。
  • 得到 blocks = "BBBBBBBWBW" 。
  • 可以证明无法用少于 3 次操作得到 7 个连续的黑块。
  • 所以我们返回 3 。

示例 2

  • 输入: blocks = "WBWBBBW", k = 2
  • 输出: 0
  • 解释:
  • 不需要任何操作,因为已经有 2 个连续的黑块。
  • 所以我们返回 0 。=

提示:

  • n == blocks.length
  • 1 <= n <= 100
  • blocks[i] 要么是 'W' ,要么是 'B'。
  • 1 <= k <= n

2.解法

class Solution {
    public int minimumRecolors(String blocks, int k) {
        char[] chars = blocks.toCharArray();
        int left = 0;
        int length = blocks.length();
        int right = 0;
        int num = 0;
        int max = 0;
        for(right = 0; right < k; right++) {
            if(chars[right]=='B') {
                num++;
            }
        }
        max = num;
        while(right < length) {
            if(chars[right]=='B') {
                num++;
            }
            if(chars[left]=='B') {
                num--;
            }
            left++;
            right++;
            max =Math.max(max,num);
        }
        if(k <= max) return 0;
        return k - max;
    }
}

解析

作为第一题并没有什么难度,使用双指针法(滑动窗口法),首先右指针往右数K个,左指针还在0处,数出此时左右指针内的B的数量,此时左右指针开始向右移动,右指针如果是B,那么sum+1,左指针如果是B那么sum-1,找出最大的sum,然后如果sum大于等于k,那就不需要涂色,如果sum小于k,那就返回k-sum就可以了。

第二题链接如下

[杨小白]_leetcode_第85场双周赛-第二题2380. 二进制字符串重新安排顺序需要的时间

第三题链接如下

[杨小白]_leetcode_第85场双周赛-第三题2381. 字母移位 II

3.结束

这个题作为第一题,基本没什么难度,五分钟就能ac了,gogogo,刷题刷题,每天一道,三年1000道!!!!