leetcode 每日一题 四月四号
class NumArray {
private:
vector<int> segmentTree;
int n;
void build(int node,int l,int r,vector<int>& nums){
if(l == r) {segmentTree[node] = nums[l];return ;}
int m = ( l + r) / 2;
build(2 * node + 1, l, m, nums);
build(2 * node + 2, m + 1, r, nums);
segmentTree[node] = segmentTree[2 * node + 1] + segmentTree[2 * node + 2];
}// build the segmentTree
/* use segmentTree[0] as the root ,the sum of all nums
*/
//change the value of the segmentTree
void change(int dex, int val,int node, int l,int r)
{
if( l == r) {segmentTree[node] = val;
while(node != 0 ){
node = (node - 1) / 2;
segmentTree[node] = segmentTree[2 * node + 1] + segmentTree[2 * node + 2];
}
return ;}
int m = (l + r) / 2;
if(dex <= m) change(dex,val,2 * node + 1,l, m);
else change(dex,val,2 * node + 2,m + 1,r);
}
int range(int left,int right,int l,int r,int node){
int m = (l + r) / 2;
if(left == l && right == r) return segmentTree[node];
else if(right <= m)
return range(left,right,l,m,2 * node + 1);
else if(left > m)
return range(left,right,m + 1,r,2 * node + 2);
else
return range(left, m, l, m,2 * node + 1) +
range(m + 1, right,m + 1,r,2 * node + 2);
}
public:
NumArray(vector<int>& nums): n(nums.size()),segmentTree(nums.size() * 4) {
build(0,0,n - 1,nums);
}
void update(int index, int val) {
change(index,val,0,0,n - 1 );
}
int sumRange(int left, int right) {
return range(left,right,0,n - 1,0);
}
};
以上为代码;
-
线段树结构产生的需求
求某个区间的最值或者和,且调用的频率很高的时候 ,可以将数据存储在线段树中, -
做题的时候遇到的问题,更新节点的时候没有更新上面 的节点,构建堆的时候,插入节点的时候也需要更新上面的节点
思考:直接用一个数组能不能存储数组的和?