题目描述:
给定一个整数数组 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 函数的调用次数是均匀分布的。
方法1:
主要思路:
(1)类似积分图像,只不过是一维的;
(2)主要的变化点是需要考虑更新的情形,故需要存储原始的元素,来实现后续的更新操作;
class NumArray {
public:
vector<int> sum_num;//积分图像数组,既前面的元素的累加和
vector<int> nums_arr;//原始的数组
NumArray(vector<int>& nums) {
nums_arr=nums;//保留原始的数组
sum_num=vector<int>(nums.size()+1,0);
for(int i=1;i<=nums.size();++i){//求累加和
sum_num[i]=sum_num[i-1]+nums[i-1];
}
}
//更新数组中的某个元素时,同时更新累加和
void update(int i, int val) {
int diff=val-nums_arr[i];//和原始的元素的差异
nums_arr[i]=val;//更新元素
while(++i<sum_num.size()){//更新累加和
sum_num[i]+=diff;
}
}
int sumRange(int i, int j) {
return sum_num[j+1]-sum_num[i];//根据累加和,直接返回需要范围内的元素和
}
};
/**
* 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);
*/