定义
在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的数组
- 求和方式:sum[i] = sum[i-1] + arr[i-1]
- 求值方式:对于区间[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];
}