【问题标题】:Equilibrium index of a given sequence: What is the best algorithm to find one?给定序列的平衡指数:找到一个的最佳算法是什么?
【发布时间】:2021-04-25 14:01:05
【问题描述】:

序列的平衡索引是一个索引,使得较低索引处的元素之和等于较高索引处的元素之和。例如,在序列 A 中:

A[0]=-7 A[1]=1 A[2]=5 A[3]=2 A[4]=-4 A[5]=3 A[6]=0

3 是一个均衡指标,因为:

A[0]+A[1]+A[2]=A[4]+A[5]+A[6]

6也是一个均衡指标,因为:

A[0]+A[1]+A[2]+A[3]+A[4]+A[5]=0

(零元素之和为零) 7 不是平衡索引,因为它不是序列 A 的有效索引。 如果你还有疑问,这是一个精确的定义:整数 k 是一个序列的平衡指数当且仅当 和 。

假设零元素的总和等于零。写一个函数

int equi(int[] A);

给定一个序列,返回其平衡索引(任意),如果不存在平衡索引,则返回 -1。假设序列可能很长。

【问题讨论】:

  • 对于那些试图阅读这个的人来说,序列是{-7, 1, 5, 2 -4, 3, 0}

标签: algorithm language-agnostic math


【解决方案1】:
  1. 计算A中所有元素的总和
  2. 对于每个索引i,计算从A[0]A[i - 1] 的元素之和,直到和等于(totalSum - A[i]) / 2

注意从A[0]A[i - 1]的元素之和可以作为运行总和进行跟踪,这意味着整个算法的复杂度为O(n)。作为代码实现留给读者作为练习。

【讨论】:

  • 这可能会在任意序列上失败,因为平衡指数并不总是涉及序列的所有元素。在序列 {1,2,3,4,5,10} 中,根据给定的定义,4 将是平衡指数,但元素 0 - 3 的总和为 10,小于元素总和除以2. 事实上,不存在总和等于该值的元素子集,但存在平衡指数。
  • 是的,所以修改答案if we find our partial sum to be greater than half of the whole sum, return -1;
  • @Harper,我没有看到“平衡指数”的定义不包括该指数的值。我已经更新了我的答案。
  • 看起来就明白了。有道理,并通过了我能看到的测试。保持 O(n) 只会让它变得更好。
【解决方案2】:

这是一个使用O(n) 内存的解决方案。计算S[i] = A[0] + A[1] + ... + A[i]。那么子序列[i, j]之和就是Sum(i, j) = S[j] - S[i - 1]S[x < 0] = 0)。

所以对于从0A.Length - 1 的每个i,检查Sum(0, i - 1) = Sum(i + 1, A.Length - 1) 是否。

事实上,如果允许你销毁给定的数组,你甚至不需要S,你可以在A中做这一切。

【讨论】:

    【解决方案3】:

    伪代码 - 最坏的情况是 2 次通过 A。

    R = sum(A)
    L = e = 0
    for i = 0 .. A.size
      L+=e
      R-=(e=A[i])
      return i if L==R
    end
    return NULL
    

    【讨论】:

      【解决方案4】:

      a = (-7, 1, 5, 2, -4, 3, 0)

      sumleft = 0

      sumright = 0

      for i in range(len(a)):

      for j in range(i+1,len(a)):
      
          sumright += a[j]
      
      if sumright == sumleft:
      
          print i
      
      sumleft += a[i]
      
      sumright = 0
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-05-21
        • 2011-12-20
        • 1970-01-01
        • 1970-01-01
        • 2010-11-27
        • 1970-01-01
        相关资源
        最近更新 更多