查找当前索引到所有其他索引的距离之和

时间:2020-10-10 20:28:46

标签: algorithm array-algorithms

例如,给定一个数组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 的绝对值表示。

1 个答案:

答案 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;
}