力扣地址:307. 区域和检索 - 数组可修改 - 力扣(LeetCode)
我们可以使用一个成员变量来存储整数数组nums
,在构造函数中进行初始化。然后,我们可以使用一个辅助数组prefixSum
来存储每个位置的前缀和。在更新操作时,我们更新nums
数组的同时也更新prefixSum
数组。在求和操作时,我们可以通过计算prefixSum[right] - prefixSum[left-1]
来得到索引left
和索引right
之间的元素和。
class NumArray {
private int[] nums;//来接受传来的数组
private int[] prefixSum;//用来操作
public NumArray(int[] nums) {
this.nums = nums;//数组名一样,用this来区分
int n = nums.length;
prefixSum = new int[n];//造一个和nums长度一样的数组
prefixSum[0] = nums[0];
for (int i = 1; i < n; i++) {
prefixSum[i] = prefixSum[i - 1] + nums[i];
}
}
public void update(int index, int val) {
int diff = val - nums[index];
nums[index] = val;
for (int i = index; i < nums.length; i++) {
prefixSum[i] += diff;
}
}
public int sumRange(int left, int right) {
if (left == 0) {
return prefixSum[right];
} else {
return prefixSum[right] - prefixSum[left - 1];
}
}
}