携手创作,共同成长!这是我参与「掘金日新计划 · 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道!!!!