题目

给你一个整数数组 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;
};