计算具有奇数和的子数组的数量

时间:2018-08-21 11:20:56

标签: arrays algorithm

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)中解决这个问题?

1 个答案:

答案 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。

因此,如果当前元素为奇数,我们将增加奇数计数器,否则将增加偶数计数器。

另外,如果当前元素为奇数,则我们必须交换奇数/偶数计数器的数目,因为如果我们将当前的-奇数-数目添加到子数组中,它将改变其奇偶校验。

最后,将当前奇数子数组的数量添加到结果变量中-实际上是计算在当前位置结束的奇数子数组。