1248. 统计「优美子数组」
题目
给你一个整数数组 nums 和一个整数 k。
如果某个 连续 子数组中恰好有 k 个奇数数字,我们就认为这个子数组是「优美子数组」。
请返回这个数组中「优美子数组」的数目。
示例
输入:nums = [1,1,2,1,1], k = 3
输出:2
解释:包含 3 个奇数的子数组是 [1,1,2,1] 和 [1,2,1,1] 。
输入:nums = [2,2,2,1,2,2,1,2,2,2], k = 2
输出:16
分析
本题难在考察边界条件。
题解
/**
* @param {number[]} nums
* @param {number} k
* @return {number}
*/
var numberOfSubarrays = function(nums, k) {
let count = 0;
let arr = []; // 用于放置奇数下标
for (let i = 0; i < nums.length; i++) {
if (nums[i] % 2 === 1) {
arr.push(i);
}
}
if (arr.length < k) {
return count;
}
for (let i = 0; i + k - 1 < arr.length; i++) {
const j = i + k - 1; // 左下标 i,右下标 i+k-1
const left = i === 0 ? arr[i] + 1 : arr[i] - arr[i - 1];
const right = j === arr.length - 1 ? nums.length - arr[j] : arr[j + 1] - arr[j];
count += left * right;
}
return count;
};
