class NumArray {
public:
NumArray(vector<int> &nums) {
trees=vector<int>(nums.size()*4,0);
int i;
tempSum=0;
size=nums.size();
for(i=0;i<size;i++) build(trees,i,nums[i],0,nums.size()-1,1);
}
void build(vector<int>&trees,int index,int value,int left,int right,int root)
{
if(left==right)
{
trees[root]=value;
return;
}
int middle=(left+right)/2;
if(index<=middle) build(trees,index,value,left,middle,root*2);
else build(trees,index,value,middle+1,right,root*2+1);
trees[root]=trees[root*2]+trees[root*2+1];
}
void update(int i, int val) {
build(trees,i,val,0,size-1,1);
}
int calculate(int tl,int tr,int cl,int cr,int root)
{
int middle=(cl+cr)/2;
if(tl<=cl&&cr<=tr) return trees[root];
if(middle<tl) return calculate(tl,tr,middle+1,cr,root*2+1);
else if(tr<=middle) return calculate(tl,tr,cl,middle,root*2);
else return calculate(tl,middle,cl,middle,root*2)+calculate(middle+1,tr,middle+1,cr,root*2+1);
}
int sumRange(int i, int j) {
return calculate(i,j,0,size-1,1);
}
private:
vector<int> trees;
int tempSum,size;
};
其他没啥,要注意线段树的点是原来数组点的4倍
leetCode_线段树、单点更新、区间求和
最新推荐文章于 2022-07-23 17:30:58 发布