您的位置:首页 > 产品设计 > UI/UE

leetcode Range Sum Query-Mutable

2016-09-01 16:26 309 查看
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
c485
 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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  leetcode 算法