您的位置:首页 > 其它

区间求和Ⅱ

2015-10-13 10:42 302 查看
在类的构造函数中给一个整数数组, 实现两个方法
query(start, end)
modify(index,
value)
:

对于 query(start, end), 返回数组中下标 start 到 end的 和。
对于 modify(index, value), 修改数组中下标为 index上的数为 value.

样例

给定数组 A =
[1,2,7,8,5]
.

query(0, 2)
, 返回
10
.
modify(0, 4)
, 将 A[0] 修改为 4.
query(0, 1)
, 返回
6
.
modify(2, 1)
, 将 A[2] 修改为 1.
query(2, 4)
, 返回
14
.

class Solution {
private:
struct segmentTreeNode{
int start,end;
long  long val;
segmentTreeNode *left,*right;
segmentTreeNode(int l,int r):
start(l),end(r),left(0),right(0){}
};
segmentTreeNode* build(int lo,int hi){
if(lo>hi) return NULL;
segmentTreeNode* root=new segmentTreeNode(lo,hi);
if(lo==hi) return root;
int mid=lo+(hi-lo)/2;
root->left=build(lo,mid);
root->right=build(mid+1,hi);
return root;
}
long long query(segmentTreeNode*root,int low,int high){
if(low>high) return 0;
if(low==root->start&&high==root->end){
return (long long)root->val;
}
int mid=root->start+(root->end-root->start)/2;
long long res=query(root->left,low,min(mid,high))+query(root->right,max(low,mid+1),high);
return res;

}
void getsum(segmentTreeNode *root,int i,int value){
if(root->start==root->end){
root->val=value;
return;
}
int mid=root->start+(root->end-root->start)/2;
if(i<=mid) getsum(root->left,i,value);
else getsum(root->right,i,value);
root->val=root->left->val+root->right->val;
return;
}
vector<int>v;
segmentTreeNode *root;
public:
Solution(vector<int> A) {
v=A;
root=build(0,A.size()-1);
for(int i=0;i<A.size();i++) modify(i,A[i]);
}

long long query(int low, int high) {
return query(root,low,high);
}

void modify(int index, int value) {
v[index]=value;
//root=build(0,v.size()-1);
getsum(root,index,value);
}

};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: