前缀和

95 阅读1分钟

定义

在O(1)的时间复杂度内求出区间[l,r]的和,降低求和的时间复杂度。

sum[0] = arr[0];

sum[r] = arr[0] + --- + arr[r];

则 [0, r]的和为 sum[r] - sum[-1],即[l, r]的和为sum[r] - sum[l-1],因为其中数组sum[-1] = 0,但其会越界。所以优化如下代码所示

代码

  1. 创建一个比原数组大小多1的数组
  2. 求和方式:sum[i] = sum[i-1] + arr[i-1]
  3. 求值方式:对于区间[l, r] sum = arr[r+1] - arr[l]

int[] arr = new int[]{1, 2, 3, 4, 5, 6, 7, 8};

int l = arr.length;

int[] sum = new int[l+1];
for (int i = 1; i <= l; i++) {
sum[i] = sum[i-1] + arr[i-1];
}