解法一
class NumArray {
public:
NumArray(vector<int>& nums) {
int s = 0;
for(int n: nums){
s += n;
sums.push_back(s);
}
}
void update(int i, int val) {
int diff;
if(i==0){
diff = val-sums[0];
}else{
diff = val-(sums[i]-sums[i-1]);
}
for(int j=i;j<sums.size();j++){
sums[j] += diff;
}
}
int sumRange(int i, int j) {
return i==0 ? sums[j] : sums[j]-sums[i-1];
}
private:
vector<int> sums;
};
/**
* Your NumArray object will be instantiated and called as such:
* NumArray* obj = new NumArray(nums);
* obj->update(i,val);
* int param_2 = obj->sumRange(i,j);
*/
解法二
class NumArray {
public:
NumArray(vector<int>& nums) {
if(nums.empty()) return;
data=nums;
len = ceil(sqrt(nums.size()));
block.resize(len);
for(int i=0;i<data.size();i++){
block[i/len] += data[i];
}
}
void update(int i, int val) {
int diff = val-data[i];
data[i] = val;
block[i/len] += diff;
}
int sumRange(int i, int j) {
int sum =0;
int start=i/len, end=j/len;
if(start==end){
for(int k=i;k<=j;k++){
sum += data[k];
}
return sum;
}
for(int k=i;k<(start+1)*len;k++){
sum += data[k];
}
for(int k=start+1;k<end;k++){
sum += block[k];
}
for(int k=end*len;k<=j;k++){
sum += data[k];
}
return sum;
}
private:
int len;
vector<int> data, block;
};
/**
* Your NumArray object will be instantiated and called as such:
* NumArray* obj = new NumArray(nums);
* obj->update(i,val);
* int param_2 = obj->sumRange(i,j);
*/