线段树数组实现解决307区域和检索

线段树数组实现的逻辑比较复杂......借此记录一下吧😭

详见https://leetcode-cn.com/problems/range-sum-query-mutable/solution/xian-duan-shu-zu-shou-hui-tu-xiang-yi-qing-er-chu-/

class NumArray {

    int[] tree;
    int n;

    public NumArray(int[] nums) {
        n = nums.length;
        // 非叶子节点个数为叶子结点个数+1,所以是n*2
        tree = new int[n * 2];

        // 初始化数组,都放在最后
        for(int i = n; i < 2*n; i++){
            tree[i]  = nums[i-n];
        }

        // 初始化数据前面的节点值
        for(int i = n-1; i >= 0; i--){
            tree[i] = tree[i*2] + tree[i*2+1];
        }
    }

    public void update(int i, int val) {
        // 找到索引在数组中的位置
        int pos = n + i;
        // 修改数据
        tree[pos] = val;
        // 修改节点前面与它有关的节点的值
        while(pos > 0){
            int left = pos%2==0? pos: pos-1;
            int right = pos%2==0? pos+1: pos;
            tree[pos/2] = tree[left] + tree[right];
            pos /= 2;
        }
    }

    public int sumRange(int i, int j) {
        int sum = 0;
        int l = n + i;
        int r = n + j;
        while(r >= l){
            if(l % 2 == 1){
                sum += tree[l];
                l++;
            }
            if(r % 2 == 0){
                sum += tree[r];
                r--;
            }
            l /= 2;
            r /= 2;
        }
        return sum;
    }
}

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值