【问题标题】:count number of subarrays with odd sum计算奇数子数组的数量
【发布时间】:2018-08-21 11:20:55
【问题描述】:
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) 中解决这个问题?

【问题讨论】:

标签: arrays algorithm


【解决方案1】:

这是一个简单的 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 个辅助变量。结果包含所有计数的子数组的数量。奇数和偶数包含在当前位置结束的奇数/偶数子数组。

每次我们处理下一个元素时,我们都会将子数组计数增加一个可以从给定位置开始的数组。

所以如果当前元素是奇数,我们增加奇数计数器,否则增加偶数计数器。

此外,如果当前元素是奇数,那么我们必须交换奇数/偶数计数器的数量,因为如果我们将当前奇数添加到子阵列中,那么它将改变其奇偶性。

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

【讨论】:

  • 我不能完全确定它,但我觉得应该有一个带有数学公式的 O(1) 解决方案。毕竟,如果您知道有多少个奇数和多少个偶数,您应该能够知道其中有多少加起来是奇数或偶数。
  • 奇数/偶数的顺序也很重要。所以无论如何你必须枚举元素。实际上,即使有一个公式,您仍然需要计算奇数/偶数,这将是 o(n)。
  • @ChatterOne 不可能有O(1) 解决方案,因为这意味着您永远不会读取数组中的元素
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-05
  • 2022-11-22
  • 1970-01-01
  • 2016-09-19
  • 1970-01-01
  • 2019-09-19
  • 2013-08-14
相关资源
最近更新 更多