1.前缀和
今天做到一个简单题,如果直接暴力多次调用sumRange的话,就会出现超时。
https://leetcode-cn.com/problems/range-sum-query-immutable/
class NumArray {
int[] nums;
public NumArray(int[] nums) {
this.nums = nums;
}
public int sumRange(int left, int right) {
if (right < left){
throw new RuntimeException("right > left");
}
int sum = 0;
for (int i = left; i <= right; i++){
sum = nums[i] + sum;
}
return sum;
}
}
因此暴力解法似乎不太好用,于是引入前缀和。思想就是在NumArray中就将所有可能初始化。也就是:
sum[n] = f(0) + f(1) + … + f(n)
然后就可以利用这个求值
举个例子:
求:f(3) + f(4)
那就只需要将
sum[5] - sum[3] = f(0) + f(1) + f(2) + f(3) + f(4) - [f(0) + f(1) + f(2)]
= f(3) + f(4)
public class NumArray {
// 前缀和
int[] sums;
public NumArray(int[] nums) {
int n = nums.length;
sums = new int[n + 1];
for (int i = 0; i < n; i++){
sums[i + 1] = sums[i] + nums[i];
}
}
public int sumRange(int left, int right) {
if (right < left){
throw new RuntimeException("right > left");
}
return sums[right + 1] - sums[left];
}
}