leetcode Range Sum Query-Mutable

Given an integer array nums, find the sum of the elements between indices i and j (i ≤ j), inclusive.

The  update(i, val)  function modifies  nums  by updating the element at index  i  to  val .

Example:

Given nums = [1, 3, 5]

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

思路:线段树,参见博客http://www.cnblogs.com/tanky_woo/archive/2010/09/25/1834523.html

代码基本上是构造线段树的过程,update更新线段树,代码:

public class NumArray {
    class segmenttreenode{
        public segmenttreenode(int start,int end){
            this.start=start;
            this.end=end;
        }
        int sum;
        segmenttreenode left;
        segmenttreenode right;
        int start;
        int end;
    }
    segmenttreenode root=null;
    public NumArray(int[] nums) {
        root=buildTree(nums,0,nums.length-1);
    }
    public segmenttreenode buildTree(int[] nums,int begin,int end){
        if(begin>end) return null;
        segmenttreenode root=new segmenttreenode(begin,end);
        if(begin==end) root.sum=nums[begin];
        else{
        int mid=begin+(end-begin)/2;
        root.left=buildTree(nums,begin,mid);
        root.right=buildTree(nums,mid+1,end);
        root.sum=root.left.sum+root.right.sum;}
        return root;
    }
    void update(int i, int val) {
         updateVal(root,i,val);
    }
    public void updateVal(segmenttreenode root,int i,int val){
        if(root.start==root.end) root.sum=val;
        else {
            int mid = root.start + (root.end - root.start) / 2;
            if (i <= mid) updateVal(root.left, i, val);
            else updateVal(root.right, i, val);
            root.sum = root.left.sum + root.right.sum;
        }
    }

    public int sumRange(int i, int j) {
          return getSum(root,i,j);
    }
    public int getSum(segmenttreenode root,int i,int j){
        if(root.start==i&&root.end==j) return root.sum;
        int mid=root.start+(root.end-root.start)/2;
        if(i>=mid+1) return getSum(root.right,i,j);
        else if(j<=mid) return getSum(root.left,i,j);
        else return getSum(root.left,i,mid)+getSum(root.right,mid+1,j);
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值