力扣:1248 优美子数组
给你一个整数数组 nums 和一个整数 k。
如果某个 连续 子数组中恰好有 k 个奇数数字,我们就认为这个子数组是「优美子数组」。
请返回这个数组中「优美子数组」的数目。
示例 1:
输入:nums = [1,1,2,1,1], k = 3
输出:2
解释:包含 3 个奇数的子数组是 [1,1,2,1] 和 [1,2,1,1] 。
示例 2:
输入:nums = [2,2,2,1,2,2,1,2,2,2], k = 2
输出:16
思路的话我也大概想到了,就是实现起来非常的麻烦,最后写成了ifelse地狱,也没正确的处理好几个边界条件,看了题解的实现感觉这简直是神仙的边界处理方式。老规矩先上思路,因为远官方题解总结的比较好,所以我这里直接转载了力扣的官方题解:
https://leetcode-cn.com/problems/count-number-of-nice-subarrays/solution/tong-ji-you-mei-zi-shu-zu-by-leetcode-solution/
class Solution {
public int numberOfSubarrays(int[] nums, int k) {
int len = nums.length;
if(len == 0) return 0;
int[] odd = new int[len+2];
int cnt = 0;
for(int i=0;i<len;i++) {
if(nums[i]%2 == 1) {
odd[++cnt] = i;
}
}
odd[0] = -1; odd[++cnt] = len;//神一般的边界处理法则,我真是被边界搞的头都大了
int ans=0;
for(int i=1;i+k<=cnt;i++) {
ans += (odd[i] - odd[i-1])*(odd[i+k] - odd[i+k-1]);
}
return ans;
}
}