和为奇数的子数组数目
难度:
标签:
题目描述
代码结果
运行时间: 86 ms, 内存: 20.5 MB
/*
题目思路:
利用Java Stream的方式来计算和为奇数的子数组数目。思路类似于普通的Java解法,通过计算前缀和的奇偶性来判断子数组的和是否为奇数。
*/
import java.util.stream.IntStream;
public class OddSumSubarraysStream {
public static int countOddSumSubarrays(int[] arr) {
final int MOD = 1000000007;
int oddCount = 0, evenCount = 1, result = 0, prefixSum = 0;
for (int num : arr) {
prefixSum += num;
if (prefixSum % 2 == 0) {
result = (result + oddCount) % MOD;
evenCount++;
} else {
result = (result + evenCount) % MOD;
oddCount++;
}
}
return result;
}
public static void main(String[] args) {
int[] arr = {1, 3, 5};
System.out.println(countOddSumSubarrays(arr)); // 输出:4
}
}
解释
方法:
这个题解利用了数组的前缀和来确定子数组的和是否为奇数。通过维护两个计数器:odd(记录以当前元素结尾的数组的前缀和为奇数的情况数)和even(记录为偶数的情况数,初始为1代表空子数组的前缀和为0,是偶数)。遍历数组,更新当前的前缀和。如果前缀和为奇数,则增加odd计数;如果为偶数,则增加even计数。最终,奇数前缀和的数量乘以偶数前缀和的数量就是结果,因为每个奇数前缀和都可以与之前的任意一个偶数前缀和组合形成一个和为奇数的子数组。
时间复杂度:
O(n)
空间复杂度:
O(1)
代码细节讲解
🦆
为什么在这个算法中需要初始化偶数前缀和的计数器为1?
▷🦆
请解释如果当前的前缀和是奇数,为什么累加odd计数器?
▷🦆
算法中提到,最终结果是奇数前缀和与偶数前缀和的组合数。这种组合是如何形成子数组和为奇数的?
▷🦆
为什么结果需要对10^9 + 7取余?这个数字有什么特别的意义吗?
▷