题目描述:
Given an integer array nums, find the sum of the elements between indices i and j(i ≤ j),inclusive.
The update(i, val) function modifies nums by updating the element at index i to val.
Example:
Given nums = [1, 3, 5]
sumRange(0, 2) -> 9
update(1, 2)
sumRange(0, 2) -> 8
Note:
The array is only modifiable by the update function.
You may assume the number of calls to update and sumRange function is distributed evenly.
(给定一个整数数组num,找出指数i和j(i≤j)之间的元素之和。update(i,val)函数通过将索引i处的元素更新为val来修改num。)
思路:树状数组的应用,不做过多解释,不太了解树状数组,请点击树状数组的讲解。
class NumArray {
//树状数组
private int bit[];
//用于找出num的二进制数的最后一个1
private int dealBit(int num)
{
return num&(-num);
}
//当nums某一位加上一个数时,用于改变整个树状数组.
private void add(int index,int num)
{
while(index<=bit.length-1)
{
bit[index] += num;
index += dealBit(index);
}
}
//用于求前n个数的和
private int sum(int n)
{
int sum = 0;
while(n>0)
{
sum += bit[n];
n -= dealBit(n);
}
return sum;
}
public NumArray(int[] nums)
{
bit = new int[nums.length+1];
for(int i=0;i<nums.length;i++)
{
add(i+1,nums[i]);
}
}
public void update(int i, int val)
{
//(sum(i+1)-sum(i))是用前i个数的和减去前i-1个数的和得到nums[i]的值.
add(i+1,val-(sum(i+1)-sum(i)));
}
public int sumRange(int i, int j)
{
if(i>j)
return 0;
//前j个的和减去前i-1个的和就是i到j的和,要注意nums的0到n位对应bit的1到n+1位.
return sum(j+1)-sum(i);
}
}
public class Range_Sum_Query_Mutable {
public static void main(String[] args) {
int nums[] = {-28,-39,53,65,11,-56,-65,-39,-43,97};
int i1 = 3;
int j = 7;
int i2 = 3;
int val = -72;
NumArray obj = new NumArray(nums);
System.out.println(obj.sumRange(i1,j));
obj.update(i2,val);
System.out.println(obj.sumRange(i1,j));
}
}