给定一个数组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在这个网站上不起作用......这就是为什么有美元符号浮动的原因......)
这是我在数学论坛上提出的问题:
答案 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;
}