计算n个数字两两相乘的和

problem

\(已知给出一个长为n的序列 a,a中的每个数值为a_i,求所有任意两两匹配相乘的和(不与自己相乘)\)

solution

\(1)简单的for循环思想来进行两两匹配\) \(O(n^2)\)

for(int i=1;i<n;i++){
	for(int j=i+1;j<=n;j++){
        res += a[i]*a[j];
    }
}

\(2)通过前缀和来求解\) \(O(n)\)

例如:
\(a[1]*a[2]+...+a[1]*a[n] = a[1]*(a[2]+..+a[n]);\)
\(a[2]*a[3]+...+a[2]*a[n] = a[2]*(a[3]+..+a[n]); //所以式子也就出来了\)

\(\sum_{i=1}^n a[i]*(sum-a[i]); sum为\sum_{i=1}^n a[i]\)

for(int i=1;i<n;i++){
    res += a[i]*(sum-a[i]);
}
posted @ 2020-04-19 18:41  Tianwell  阅读(1261)  评论(0编辑  收藏  举报