前言
经过前期的基础训练以及部分实战练习,粗略掌握了各种题型的解题思路。现阶段开始专项练习。
描述
给你一个整数数组
arr
。请你返回和为 奇数 的子数组数目。由于答案可能会很大,请你将结果对
10^9 + 7
取余后返回。示例 1:
输入:arr = [1,3,5] 输出:4 解释:所有的子数组为 [[1],[1,3],[1,3,5],[3],[3,5],[5]] 。 所有子数组的和为 [1,4,9,3,8,5]. 奇数和包括 [1,9,3,5] ,所以答案为 4 。示例 2 :
输入:arr = [2,4,6] 输出:0 解释:所有子数组为 [[2],[2,4],[2,4,6],[4],[4,6],[6]] 。 所有子数组和为 [2,6,12,4,10,6] 。 所有子数组和都是偶数,所以答案为 0 。示例 3:
输入:arr = [1,2,3,4,5,6,7] 输出:16示例 4:
输入:arr = [100,100,99,99] 输出:4示例 5:
输入:arr = [7] 输出:1提示:
1 <= arr.length <= 10^5
1 <= arr[i] <= 100
实现原理与步骤
1.累加和为偶数,减去前序累加和为奇数的情况,剩余的为奇数。在计算个数情况下等于前序的奇数个数。
2.累加和为奇数,减去前序累加和为偶数的情况,剩余的为偶数。在计算个数情况下等于前序的偶数个数。
3.初始化odd为0,even为1.1代表[]空偶值情况。
4.之前考虑此方法是否会存在重复情况,由于累加和持续随数字位置递增,剩余的尾数不断在更新则不会出现重复情况。
实现代码
class Solution {
private static final int MODULO = 1000000007;
public int numOfSubarrays(int[] arr) {
int odd = 0, even = 1;
int res = 0;
int sum = 0;
int length = arr.length;
for (int i = 0; i < length; i++) {
sum += arr[i];
res = (res + (sum % 2 == 0 ? odd : even)) % MODULO;
if (sum % 2 == 0) {
even++;
} else {
odd++;
}
}
return res;
}
}