找到一个索引,使所有部分和都是非负的

时间:2013-10-26 03:08:12

标签: arrays algorithm indexing integer

给定一个数组a []的任意大小为N的整数为0的整数(例如,a [] = {-1,0,5,3,-9,2}),是否总有一个索引我($ 0 \ le i \ le N-1 $)这样每个部分和$ S_j = \ sum_ {k = i} ^ j a_ {k \ pmod N} $(带$ N + i-1 \ ge j \ ge i $)是非负的?

在示例中a [] = {-1,0,5,3,-9,2},其中$ a_0 = -1,a_1 = 0,... a_5 = 2 $(我们可以检查$ \ sum_ {k = 0} ^ {5} a_k = 0 $),我们可以从$ i = 5 $开始,这样部分总和为$ 2,1-1,2-1 + 0,2-1 + 0 + 5 ,2-1 + 0 + 5 + 3,2-1 + 0 + 5 + 3-9 $都是非负的。

如果我们能证明这样的索引$ i $总是存在,那么找到索引$ i $的有效算法是什么?有一个明显的$ O(N ^ 2)$算法,但我们可以用$ O(N)$来做吗?感谢。

注意:这个问题有点类似于另一个问题:给定一个整数数组$ a_0,a_1,a_2,...,a_n $(它们不必加起来为0),找到$ \ max_ { 0 \ le i \ le j \ le n} \ sum_ {k = i} ^ j a_k $。这可以及时解决$ O(n)$,如下:

int maxsum = INT_MIN;
int sum = 0;
for (int i=0; i < a.length(); ++i) {
    if (sum <= 0) { sum = a[i]; }
    else { sum += a[i]; }
    maxsum = max(sum, maxsum);
}

但在我原来的问题中,我们被允许循环,我们需要找到索引。所以这两个问题之间至少存在两个差异。

(糟糕,LaTeX在这个网站上不起作用......这就是为什么有美元符号浮动的原因......)

这是我在数学论坛上提出的问题:

https://math.stackexchange.com/questions/539923/finding-the-index-such-that-all-partial-sums-are-nonnegative

1 个答案:

答案 0 :(得分:0)

代码价值千言万语。 它应该是正确的。我实际上并没有跑去检查。

c code:

int getTheIndex(int* a,int length){
 int min=a[0];
 int mini=0;
 int sum=a[0];
 for(int t=1;t<length;t++){
  sum+=a[t];
  if(min<sum){
   min=sum;
   mini=t;
  }
 }
 return mini;
}