Arrays 如何计算两种模式之和的n(n+;1)/2?
假设我有一个数组,其范围为直到Arrays 如何计算两种模式之和的n(n+;1)/2?,arrays,math,sequence,combinatorics,Arrays,Math,Sequence,Combinatorics,假设我有一个数组,其范围为直到n,比如说11,也就是说 U=1234567891011 现在,我有一个数组-A(U的子数组): 以及一个数组-B(U的另一个子数组,与a没有任何共同之处): 请注意,这3个集合都已排序 我必须为每个(a[I+1]-a[I]-1)计算n(n+1)/2,其中I是数组的索引,a是广义数组 也可考虑两端的角部情况。他们将从第一个数字中减去1,然后计算n(n+1)/2,从11中减去最后一个数字,然后计算n(n+1)/2 对于A组:我们得到 (3-1-1)*+(4-3-1)*
n
,比如说11,也就是说
U=1234567891011
现在,我有一个数组-A(U的子数组):
以及一个数组-B(U的另一个子数组,与a没有任何共同之处):
请注意,这3个集合都已排序
我必须为每个(a[I+1]-a[I]-1)
计算n(n+1)/2
,其中I
是数组的索引,a
是广义数组
也可考虑两端的角部情况。他们将从第一个数字中减去1,然后计算
n(n+1)/2
,从11中减去最后一个数字,然后计算n(n+1)/2
对于A组:我们得到
(3-1-1)*+(4-3-1)*+(9-4-1)*+角盒
这里是角落案例:(1-0)*+(11-9)*
x*表示x(x+1)/2
同样,对于集合B:我们有(5-2-1)*+(6-5-1)*+(10-6-1)*+(2-1)*+(11-10)*
现在,我必须使用O(1)复杂度中的集合A和集合B来计算(AUB)的解。有办法做到这一点吗
对于O(N)复杂度,我刚刚合并了两个数组并应用上面的公式
A U B : 1,2,3,4,5,6,9,10
因此,解决方案=
(9-6-1)*+(11-10)*
也许您可以使用伸缩和
().
我之所以这样想,是因为在每个循环(数组的每个索引)中,都要减去在上一个循环中添加的数字:
u[2] - u[1] - 1 + u[3] - u[2] - 1 + u[4] - u[3] - 1 + ... + u[n] - u[n-1]- 1
这给了你:
- u[1] - 1-...-1 + u[n]
= u[n] - n - u[1]
此外,A和B没有共同之处,这就是为什么:
n = lenght(A) + length (B)
另外,由于您订购了您的号码:
u[1] = min ( A[1] , B[1] )
u[n] = max ( A[length[A]] , B[length[B]] )
所以我们有:
Solution = max ( A[length[A]] , B[length[B]] ) - lenght(A) - length (B) - min ( A[1] , B[1] )
我希望我能在这个问题上帮助你。(对不起,如果我在英语中犯了一些错误)。< /P>没有C++代码,没有C++答案。
u[1] = min ( A[1] , B[1] )
u[n] = max ( A[length[A]] , B[length[B]] )
Solution = max ( A[length[A]] , B[length[B]] ) - lenght(A) - length (B) - min ( A[1] , B[1] )