leetcode [307]Range Sum Query - Mutable
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.
题目大意:
得到数组给定范围内的和
解法:
我就是很简单的解法,并没有做优化。
java:
class NumArray {
private int[] nums;
public NumArray(int[] nums) {
this.nums=new int[nums.length];
for (int i=0;i<nums.length;i++)
this.nums[i]=nums[i];
}
public void update(int i, int val) {
this.nums[i]=val;
}
public int sumRange(int i, int j) {
int sum=0;
for (int index=i;index<=j;index++){
sum+=this.nums[index];
}
return sum;
}
}
看网上的解法还可以使用树状数组来做https://blog.csdn.net/Small_Orange_glory/article/details/81290634,这种数据结构真的很巧妙,巧妙运用了数字二进制。
class NumArray {
private int[] nums;
private int[] BIT;
private int n;
public NumArray(int[] nums) {
this.nums=nums;
n= nums.length;
this.BIT=new int[n+1];
for (int i=0;i<n;i++)
init(i,nums[i]);
}
private void init(int i,int val){
i++;
while(i<=n){
BIT[i]+=val;
i+=(i&(-i));
}
}
public void update(int i, int val) {
int diff=val-nums[i];
nums[i]=val;
init(i,diff);
}
private int sum(int i){
int sum=0;
i++;
while(i>0){
sum+=BIT[i];
i-=(i&(-i));
}
return sum;
}
public int sumRange(int i, int j) {
return sum(j)-sum(i-1);
}
}

浙公网安备 33010602011771号