例如,给定一个数组arr(0, 0, 1, 1, 1)
,如果值是1,我需要找到所有其他索引到当前索引的距离之和。例如,我在O(n ^ 2)表示法,但是我知道我可以在O(n)中做到。
arr = [0, 1, 1, 1, 1]
for(i = 0; i < arr.length; i++) {
sum = 0;
for(j = 0; j < arr.length; j++) {
if(arr[j] == 1 && j != i) {
sum += Math.abs(j - i);
}
}
return_arr[i] = sum;
}
(不使用任何特定语言)
距离用 j - i 的绝对值表示。
答案 0 :(得分:2)
无论值是否为1,任何索引i左侧的值的数量均为i,而其右侧的值的数量为n-1-i,其中n为数组的长度。
您知道前n个自然数的总和,即1,2,3,... n为n(n + 1)/ 2
您对左边的索引数求和= i(i + 1)/ 2
右边的索引总数=(n-i-1)(n-i)/ 2
将两个总和相加得到一个索引= i(i + 1)/ 2 +(n-i-1)(n-i)/ 2的总和
对每个值为1的索引执行此操作。
伪代码:
GetSumAtEachIndex(arr) {
n = arr.length
sum = array(n)
for ( i = 0; i < arr.length; i++ ) {
if ( arr[i] == 1 ) {
sum[i] = i*(i+1)/2 + (n-i-1)*(n-i)/2;
}
}
return sum;
}