假定一个数组,我们需要计算他的所有数两两乘积的和。
比如:大小为4的数组a有元素a0 a1 a2 a3
那么两两乘积为:
a0 * a1 + a0 *a2 + a0 * a3 + a1 * a2 + a1 * a3 + a2 * a3
常规思路是用两个for循环。
for (int i = 0; i < len; i++) {
for (int j = i + 1; j < len; j++) {
sum += a[i] * a[j];
}
}
这种解法的时间复杂度是O(n2),因此在一些数据集比较大的地方容易超时。
一种O(n)的解法如下:
可以将a0 * a1 + a0 *a2 + a0 * a3 + a1 * a2 + a1 * a3 + a2 * a3
转化成如下等式
a0 * a1 + (a0 + a1) * a2 + (a0 + a1 + a2) * a3
int tmp = a[0];
for (int i = 1; i < len; i++) {
sum += tmp * a[i];
tmp += a[i];
}