如何找到数组中间元素的总和,或者检查条件的总和是否为15?
例如,数组{3,2,10, 4, 1
,6,9}居中为15,因为序列10
,4
,1
{{1} }到sums
,序列前面有两个元素(15
,3
),后跟两个元素(2
,6
)。
因此,请返回9
,因为序列1
总和为10, 4, 1
,并且前面有两个元素,后跟两个元素。请注意,还有另一个序列汇总为15
(15
,6
)。只要至少其中一个序列居中,数组就可以有多个总和为9
的序列。
同样,对于数组15
,返回{2, 10, 4, 1, 6, 9}
因为(0
)前面有一个元素,但后跟两个元素。 (10, 4, 1
)前面有五个元素,但后面没有。因此,两者都没有资格作为中心。
9, 6
答案 0 :(得分:3)
我们应该澄清我们使用的术语:
如果序列的右侧和左侧有多少个元素,则序列居中
输入数组
A
的长度为n
如果我们使用这些定义,我们应该只考虑以下定义的序列:
max_p = (n-1)/2
p
中[0..max_p]
[p, (n-1)-p]
编写一个循环于p
的可能值的程序,然后将数组元素从索引p
求和到(n-1)-p
,这应该是直截了当的。
这将导致至少O(n²)
次操作。
您还可以注意到,从i
到j
的元素总和,我们称之为S(i,j)
是从i+1
到{{1}的元素之和加上j-1
。
A[i]+A[j]
这种观察应该引导您使用S(i,j) = S(i+1,j-1) + A[i] + A[j]
操作和单个循环的算法。
O(n)
请注意,此算法可以处理输入数组中的正值和负值。
答案 1 :(得分:0)
假设我们谈论的是中三, 从设计角度来看:检查奇数,如果不是则返回0。 然后从整个数组中减去3,并将余数除以2。 然后,在进行检查之前,从数组中的这些元素开始,添加三次。
我刚刚说过的代码示例:
{
if(len%2==0)
{
return 0;
}
int a,b=0,sum=0;
a=len-3;
a/=2;
for (;b<3;b++)
{
next=array[a+b];
sum+=next;
}
if (sum==15)
{
return 1;
}
return 0;
}