欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-03-05 15:35:07
...

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);
 */