LeetCode 307. 区域和检索 - 数组可修改

307区域和检索 - 数组可修改


给定一个整数数组  nums,求出数组从索引 到 j  (i ≤ j) 范围内元素的总和,包含 i,  j 两点。

update(i, val) 函数可以通过将下标为 的数值更新为 val,从而对数列进行修改。

示例:

Given nums = [1, 3, 5]

sumRange(0, 2) -> 9
update(1, 2)
sumRange(0, 2) -> 8

说明:

  1. 数组仅可以在 update 函数下进行修改。
  2. 你可以假设 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);
 */

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值