public static int numberOfSubarrays(int[] nums, int k) {
// 保存奇数的位置
int[] indexArr = new int[nums.length];
// 保存奇数的数量
int count = 0;
for (int i = 0; i < nums.length; ++i) {
if (1 == ((nums[i]) & 1)) {
indexArr[count] = i;
++count;
}
}
// 如果没有足够的奇数,则有0个优美数组
if (count < k) return 0;
int sum = 0;
for (int i = 0; i < count; ++i) {
// 标记开始的长度
int startLength = 0;
// 如果是第一个奇数,则 开始长度 为奇数的位置+1。
// 否则 开始长度 则是这个奇数与上一个奇数的中间的数字数量+奇数本身1
if (i > 0) {
startLength = indexArr[i] - indexArr[i - 1];
} else if (i == 0) {
startLength = indexArr[i] + 1;
}
// 标记结尾的长度
int endLength = 0;
// 如果当前第i奇数 + k 已超过 奇数的总个数 则返回优美子数组个数
// 如果当前第i奇数 + k = 奇数的总个数, 则 结尾长度为 原数组大小 减去 末尾奇数的位置
// 如果当前第i奇数 + k < 奇数的总个数, 则 结尾长度为 第i+k奇数的位置 减去 第i+k-1奇数的位置
if (i + k > count) {
return sum;
} else if (i + k == count) {
endLength = nums.length - indexArr[i + k - 1];
} else if (i + k < count) {
endLength = indexArr[i + k] - indexArr[i + k - 1];
}
// 两端长度相乘 得出包含当前奇数 的 优美子数组的个数
sum += startLength * endLength;
}
return sum;
}
public static void main(String[] args) {
int[] arr = new int[]{1, 1, 2, 1, 1};
System.out.println(numberOfSubarrays(arr, 3));
}