给你一个整数数组 nums 和一个整数 k。如果某个连续子数组中恰好有 k 个奇数数字,我们就认为这个子数组是「优美子数组」。
请返回这个数组中 「优美子数组」 的数目。
示例 :
输入:nums = [1,1,2,1,1], k = 3 输出:2 解释:包含 3 个奇数的子数组是 [1,1,2,1] 和 [1,2,1,1] 。
思路:
- oddIndexArray: 存放 nums 中所有的奇数的下标,另外将 -1 放入数组第一位,nums.length 放入最后一位。例如 nums=[1,2,2,3,5,4] 则 oddIndexArray=[-1, 0, 3, 4, 6]
- 遍历到oddIndexArray[i] 时,对于左边有
oddIndexArray[i] - oddIndexArray[i-1] 种,例如遍历到 oddIndexArray中的3,那在nums中左边下标可以是1~3,因为上一个奇数的下标是0,所以要从1开始。同理,右边范围就是 oddIndexArray[i+k] - oddIndexArray[i+k-1] 种
var numberOfSubarrays = function(nums, k) {
let total = 0
let oddIndexArray = []
let oddAmount = 0
for(let i in nums){
if(nums[i] % 2 !== 0){
oddAmount++
oddIndexArray.push(i)
}
}
oddIndexArray.push(nums.length)
oddIndexArray.unshift(-1)
for(let i = 1; i < oddAmount-k+2; i++){
total += (oddIndexArray[i] - oddIndexArray[i-1]) * (oddIndexArray[i+k] - oddIndexArray[i+k-1])
}
return total
};
|