307. 区域和检索 - 数组可修改
给定一个整数数组 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 函数的调用次数是均匀分布的。
可以先看线段树:点击打开链接 某博主超详细教程
/* 题意:查询区间值,修改区间值 思路:线段树模板 */ class NumArray { public: int* tree; int size; //建树 void build(int l,int r,int x,vector<int>& nums){ if(l==r) tree[x]=nums[l-1]; else{ int mid=(l+r)>>1; build(l,mid,x<<1,nums); build(mid+1,r,x<<1|1,nums); tree[x]=tree[x<<1]+tree[x<<1|1]; } } //更新 void update(int pos,int l,int r,int val,int x){ if(l==r){ tree[x]=val; return; }else{ int mid=(l+r)>>1; if(mid >= pos){ update(pos,l,mid,val,x<<1); }else{ update(pos,mid+1,r,val,x<<1|1); } } tree[x]=tree[x<<1]+tree[x<<1|1]; } int query(int ll,int rr,int l,int r,int x){ if(ll<=l && r<=rr){ return tree[x]; } int mid = (l+r)>>1; int ans=0; if(mid >= ll){ ans+=query(ll,rr,l,mid,x<<1); } if(rr>mid){ ans+=query(ll,rr,mid+1,r,x<<1|1); } return ans; } NumArray(vector<int> nums) { size=nums.size(); tree = new int[size<<2]; if(size){ build(1,size,1,nums); } } void update(int i, int val) { update(i+1,1,size,val,1); } int sumRange(int i, int j) { return query(i+1,j+1,1,size,1); } }; /** * 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); */