线段树segment tree

线段树详解(https://www.bilibili.com/video/av47331849)

上面这个视频详细介绍了线段树的创建、更新、与查询操作,看懂这个视频,基本上就会写线段树了。

307. Range Sum Query - Mutable

提交之后AC代码如下:

class NumArray {

    private int[] nums = null;
    private int[] nodes = null;
    private int numLen = 0;
    private int nodeLen = 0;

    public NumArray(int[] nums) {
        if (nums.length == 0) return;
        this.nums = nums;
        numLen = nums.length;
        nodeLen = 4 * nums.length + 4;
        this.nodes = new int[nodeLen];

        buildTree(0, numLen - 1, 1);
    }

    public void update(int i, int val) {
       nums[i] = val;
       updateTree(0, numLen - 1, i, 1);
    }

    public int sumRange(int i, int j) {
        return querySumTree(0, numLen - 1, i, j, 1);
    }

    private int querySumTree(int start, int end, int leftQ, int rightQ, int rootNode) {
        
        if (leftQ > end || rightQ < start) {
            return 0;
        }
        
        if (start == end) {
            return nums[start];
        }


        if (leftQ <= start && rightQ >= end) {
            return nodes[rootNode];
        }

        int mid = (start + end) / 2;
        int leftSum = querySumTree(start, mid, leftQ, rightQ, rootNode * 2);
        int rightSum = querySumTree(mid + 1, end, leftQ, rightQ, rootNode * 2 + 1);
        return leftSum + rightSum;
    }

    private void updateTree(int start, int end, int updateIndex, int rootNode) {
        if (start == end) {
            nodes[rootNode] = nums[start];
            return;
        }

        int mid = (start + end) / 2;
        if (updateIndex >= start && updateIndex <= mid) {
            updateTree(start, mid, updateIndex,rootNode * 2);
        } else {
            updateTree(mid + 1, end, updateIndex, rootNode * 2 + 1);
        }

        nodes[rootNode] = nodes[rootNode * 2] + nodes[rootNode * 2 + 1];
    }

    private void buildTree(int start, int end, int rootNode) {
        if (start == end) {
            nodes[rootNode] = nums[start];
            return;
        }

        int mid = (start + end) / 2;

        buildTree(start, mid, rootNode * 2);
        buildTree(mid + 1, end, rootNode * 2 + 1);

        nodes[rootNode] = nodes[rootNode * 2] + nodes[rootNode * 2 + 1];
    }
}

线段树开4倍空间证明

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值