Input : arr[] = {5, 4, 4, 5, 1, 3}
Output : 12
下面是通过生成所有子数组的O(n ^ 2)方法:-
These are possible subarrays with odd sum.
1) {5} Sum = 5 (At index 0)
2) {5, 4} Sum = 9
3) {5, 4, 4} Sum = 13
4) {5, 4, 4, 5, 1} Sum = 19
5) {4, 4, 5} Sum = 13
6) {4, 4, 5, 1, 3} Sum = 17
7) {4, 5} Sum = 9
8) {4, 5, 1, 3} Sum = 13
9) {5} Sum = 5 (At index 3)
10) {5, 1, 3} Sum = 9
11) {1} Sum = 1
12) {3} Sum = 3
但是如何在O(n)中解决这个问题?
答案 0 :(得分:0)
这是JAVA中的一个简单解决方案:
public class Odd {
static int[] arr = { 5, 4, 4, 5, 1, 3 };
public static void main(String... args) {
int odd = 0;
int even = 0;
int result = 0;
for (int i : arr) {
if (i % 2 == 0) {
even++;
} else {
int temp = even;
even = odd;
odd = temp + 1;
}
result += odd;
}
System.out.println(result);
}
}
这是背后的逻辑:
我们正在遍历数组的所有元素(这就是为什么它将是O(n))。 我们有3个辅助变量。结果包含所有计数的子数组的数量。奇数广告甚至包含以当前位置结尾的奇数/偶数子数组。
每次处理下一个元素时,我们都会从可在给定位置开始的数组增加subarray-count。
因此,如果当前元素为奇数,我们将增加奇数计数器,否则将增加偶数计数器。
另外,如果当前元素为奇数,则我们必须交换奇数/偶数计数器的数目,因为如果我们将当前的-奇数-数目添加到子数组中,它将改变其奇偶校验。
最后,将当前奇数子数组的数量添加到结果变量中-实际上是计算在当前位置结束的奇数子数组。