给定一个整数数组 nums,求出数组从索引 i 到 j (i ≤ j) 范围内元素的总和,包含 i, j 两点。
update(i, val) 函数可以通过将下标为 i 的数值更新为 val,从而对数列进行修改。
示例:
Given nums = [1, 3, 5]
sumRange(0, 2) -> 9
update(1, 2)
sumRange(0, 2) -> 8
说明:
数组仅可以在 update 函数下进行修改。
你可以假设 update 函数与 sumRange 函数的调用次数是均匀分布的
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/range-sum-query-mutable
public class NumArray {
int numbers[]; //用来存放各个序号对应的和,也就是模板C数组元素
public NumArray(int[] nums) {
numbers=new int[nums.length];//开辟指定长度
for(int i=0;i<numbers.length;i++)
{//赋予初值
update(i,nums[i]);
}
}
public void update(int i, int val) {
int x=sumRange(i,i); /*x保存这个点的值,并不是和,
也就是模板中的A数组的元素*/
for(int j=i+1;j<=numbers.length;j+=(j&(-j)))//j&(-j)lowbit操作
{
numbers[j-1]+=val-x; //val-x是增量,可正可负
}
}
public int sumRange(int i, int j) {
int result1=0;
int result2=0;
for(int k=i;k!=0;k-=(k&(-k)))
{//这个是i作为起始,因为i-j的区间和应该是j的前缀和-(i-1)的前缀和
//i,j值相等时表示查询这个点的值。
result1+=numbers[k-1];
}
for(int k=j+1;k!=0;k-=(k&(-k)))
{
result2+=numbers[k-1];
}
return result2-result1 ;
}
/*public static void main(String[] args)
{作为测试
int nums[]= {9,-8};
NumArray obj = new NumArray(nums);
obj.update(0,3);
System.out.println(obj.sumRange(1, 1));
System.out.println(obj.sumRange(0, 1));
obj.update(1,-3);
System.out.println(obj.sumRange(0, 1));
}*/
}