定长滑动窗口基础模板题:LeetCode——2379.得到K个黑块的最少涂色次数和643.子数组最大平均数 1
1 、2379.得到K个黑块的最少涂色次数
. - 力扣(LeetCode)
给你一个长度为 n
下标从 0 开始的字符串 blocks
,blocks[i]
要么是 'W'
要么是 'B'
,表示第 i
块的颜色。字符 'W'
和 'B'
分别表示白色和黑色。
给你一个整数 k
,表示想要 连续 黑色块的数目。
每一次操作中,你可以选择一个白色块将它 涂成 黑色块。
请你返回至少出现 一次 连续 k
个黑色块的 最少 操作次数。
题解
十分基础的滑动窗口题目要计算涂黑的块,其实可以看成k个方块中黑色方块最多的数量
class Solution {
public int minimumRecolors(String blocks, int k) {
char[] c = blocks.toCharArray();
int count = 0;
for (int i = 0; i < k; i++) {
if (c[i] == 'B')
count++;
}
int ans = count;
for (int i = k; i < c.length; i++) {
if (c[i] == 'B')
count++;
if (c[i - k] == 'B')
count--;
ans = Math.max(ans, count);
}
return k - ans;
}
}
2、 643.子数组最大平均数 1
. - 力扣(LeetCode)
给你一个由 n
个元素组成的整数数组 nums
和一个整数 k
。
请你找出平均数最大且 长度为 k
的连续子数组,并输出该最大平均数。
任何误差小于 10-5
的答案都将被视为正确答案。
题解
求长度为k的窗口中最大和
class Solution {
public double findMaxAverage(int[] nums, int k) {
double ans = 0, sum = 0;
for (int i = 0; i < k; i++){
sum += nums[i];
}
ans = sum / k;
for (int i = k; i < nums.length; i++) {
sum = sum + nums[i] - nums[i - k];
ans = Math.max(ans, sum / k);
}
return ans;
}
}