🦸定长滑动窗口
一、练习
给你字符串
s和整数k。请返回字符串
s中长度为k的单个子字符串中可能包含的最大元音字母数。英文中的 元音字母 为(
a,e,i,o,u)。
/**
* @param {string} s
* @param {number} k
* @return {number}
*/
var maxVowels = function (s, k) {
const point = ['a', 'e', 'i', 'o', 'u']
let i = 0
let max = 0
let score = 0
while (i < s.length) {
if (point.includes(s[i])) {
score++
}
if (i < k - 1) { // 窗口大小不足 k
i++
continue;
}
max = Math.max(max, score)
const m = i - k + 1
if (point.includes(s[m])) {
score--
}
i++
}
return max
};给你一个由
n个元素组成的整数数组nums和一个整数k。请你找出平均数最大且 长度为
k的连续子数组,并输出该最大平均数。
/**
* @param {number[]} nums
* @param {number} k
* @return {number}
*/
var findMaxAverage = function (nums, k) {
let res = -999999999
let cur = 0
for (let i = 0; i < nums.length; i++) {
cur += nums[i]
if (i < k - 1) {
continue
}
res = Math.max(res, cur)
const m = i - k + 1
cur = cur - nums[m]
}
return res / k
};给你一个整数数组
arr和两个整数k和threshold。请你返回长度为
k且平均值大于等于threshold的子数组数目。
/**
* @param {number[]} arr
* @param {number} k
* @param {number} threshold
* @return {number}
*/
var numOfSubarrays = function (arr, k, threshold) {
let res = 0
let cur = 0
for (let i = 0; i < arr.length; i++) {
cur += arr[i]
if (i < k - 1) {
continue;
}
if (cur / k >= threshold) {
res++
}
const m = i - k + 1
cur -= arr[m]
}
return res
};给你一个下标从 0 开始的数组
nums,数组中有n个整数,另给你一个整数k。半径为 k 的子数组平均值 是指:
nums中一个以下标i为 中心 且 半径 为k的子数组中所有元素的平均值,即下标在i - k和i + k范围(含i - k和i + k)内所有元素的平均值。如果在下标i前或后不足k个元素,那么 半径为 k 的子数组平均值 是-1。构建并返回一个长度为
n的数组avgs,其中avgs[i]是以下标i为中心的子数组的 半径为 k 的子数组平均值 。
x个元素的 平均值 是x个元素相加之和除以x,此时使用截断式 整数除法 ,即需要去掉结果的小数部分。
/**
* @param {number[]} nums
* @param {number} k
* @return {number[]}
*/
var getAverages = function (nums, k) {
let res = 0
let ans = new Array(nums.length).fill(-1)
for (let i = 0; i < nums.length; i++) {
res += nums[i]
if (i < 2 * k) {
continue
}
const average = Math.floor(res / (2 * k + 1))
ans[i - k] = average
res -= nums[i - 2 * k]
}
return ans
};给你一个长度为
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) {
let res = 99999999
let cur = 0
for (let i = 0; i < blocks.length; i++) {
if ('B' !== blocks[i]) {
cur++
}
if (i < k - 1) {
continue
}
res = Math.min(cur, res)
const m = i - k + 1
if (blocks[m] !== 'B') {
cur--
}
}
return res
};6.爱生气的书店老板
有一个书店老板,他的书店开了
n分钟。每分钟都有一些顾客进入这家商店。给定一个长度为n的整数数组customers,其中customers[i]是在第i分钟开始时进入商店的顾客数量,所有这些顾客在第i分钟结束后离开。在某些分钟内,书店老板会生气。 如果书店老板在第
i分钟生气,那么grumpy[i] = 1,否则grumpy[i] = 0。当书店老板生气时,那一分钟的顾客就会不满意,若老板不生气则顾客是满意的。
书店老板知道一个秘密技巧,能抑制自己的情绪,可以让自己连续
minutes分钟不生气,但却只能使用一次。请你返回 这一天营业下来,最多有多少客户能够感到满意 。
/**
* @param {number[]} customers
* @param {number[]} grumpy
* @param {number} minutes
* @return {number}
*/
var maxSatisfied = function (customers, grumpy, minutes) {
let maxS1 = 0
let s = [0, 0]
for (let i = 0; i < customers.length; i++) {
s[grumpy[i]] += customers[i]
if (i < minutes.length - 1) {
continue
}
maxS1 = Math.max(maxS1, s[1])
s[1] -= grumpy[i - minutes + 1] ? customers[i - minutes + 1] : 0
}
return maxS1 + s[0]
};交换 定义为选中一个数组中的两个 互不相同 的位置并交换二者的值。
环形 数组是一个数组,可以认为 第一个 元素和 最后一个 元素 相邻 。
给你一个 二进制环形 数组
nums,返回在 任意位置 将数组中的所有1聚集在一起需要的最少交换次数。
/**
* @param {number[]} nums
* @return {number}
*/
var minSwaps = function (nums) {
let oneNums = nums.reduce((prev, cur) => prev + cur, 0)
let zeroNums = 0
for (let i = 0; i < oneNums; i++) {
if (nums[i] === 0) {
zeroNums++
}
}
let newNums = nums.concat(nums)
let changeNums = zeroNums
let left = 0
for (let right = oneNums; right < nums.length + oneNums; right++) {
if (!newNums[left++]) changeNums--
if (!newNums[right]) changeNums++
zeroNums = Math.min(zeroNums, changeNums)
}
right = 0
return zeroNums
}给你一个长度为
n的整数数组nums,请你求出每个长度为k的子数组的 美丽值 。一个子数组的 美丽值 定义为:如果子数组中第
x小整数 是 负数 ,那么美丽值为第x小的数,否则美丽值为0。请你返回一个包含
n - k + 1个整数的数组,依次 表示数组中从第一个下标开始,每个长度为k的子数组的 美丽值 。
子数组指的是数组中一段连续 非空 的元素序列。
/**
* @param {number[]} nums
* @param {number} k
* @param {number} x
* @return {number[]}
*/
const getMinuByK = (k, arr) => {
const newArr = [...arr]
console.log(newArr.sort((a, b) => a - b))
return newArr.sort((a, b) => a - b)[k - 1]
}
var getSubarrayBeauty = function (nums, k, x) {
let res = []
let arr = []
for (let i = 0; i < nums.length; i++) {
arr.push(nums[i])
if (i < k - 1) {
continue
}
let cur = getMinuByK(x, arr)
cur = cur > 0 ? 0 : cur
res.push(cur)
arr.shift()
}
return res
};最后更新于
这有帮助吗?
