区间求和Ⅱ

来源:互联网 发布:java框架源码 编辑:程序博客网 时间:2024/05/17 07:47

在类的构造函数中给一个整数数组, 实现两个方法query(start, end) 和 modify(index, value):

  • 对于 query(startend), 返回数组中下标 start 到 end的 
  • 对于 modify(indexvalue), 修改数组中下标为 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);    }};



0 0
原创粉丝点击