LeetCode Top 100 Liked Questions 307. Range Sum Query - Mutable (Java版; Medium)
题目描述
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
Note:
The array is only modifiable by the update function.
You may assume the number of calls to update and sumRange function is distributed evenly.
classNumArray{private SegmentTree segmentTree;privateint[] nums;privateint n;publicNumArray(int[] nums){this.nums = nums;
segmentTree =newSegmentTree(nums, nums.length);}publicvoidupdate(int i,int val){
segmentTree.updateValue(nums, nums.length, i, val);}publicintsumRange(int i,int j){return segmentTree.getSum(n=nums.length, i, j);}}/**
* 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);
*/classSegmentTree{int st[];SegmentTree(int arr[],int n){//数组不为空if(n>0){int x =(int)(Math.ceil(Math.log(n)/ Math.log(2)));int max_size =2*(int) Math.pow(2, x)-1;
st =newint[max_size];// Memory allocation constructSTUtil(arr,0, n -1,0);}}intconstructSTUtil(int arr[],int ss,int se,int si){if(ss == se){
st[si]= arr[ss];return arr[ss];}int mid =getMid(ss, se);
st[si]=constructSTUtil(arr, ss, mid, si *2+1)+constructSTUtil(arr, mid +1, se, si *2+2);return st[si];}intgetMid(int s,int e){return s +(e - s)/2;}voidupdateValueUtil(int ss,int se,int i,int diff,int si){if(i < ss || i > se)return;
st[si]= st[si]+ diff;if(se != ss){int mid =getMid(ss, se);updateValueUtil(ss, mid, i, diff,2* si +1);updateValueUtil(mid +1, se, i, diff,2* si +2);}}voidupdateValue(int arr[],int n,int i,int new_val){if(i <0|| i > n -1){
System.out.println("Invalid Input");return;}int diff = new_val - arr[i];
arr[i]= new_val;updateValueUtil(0, n -1, i, diff,0);}intgetSum(int n,int qs,int qe){if(qs <0|| qe > n -1|| qs > qe){
System.out.println("Invalid Input");return-1;}returngetSumUtil(0, n -1, qs, qe,0);}intgetSumUtil(int ss,int se,int qs,int qe,int si){if(qs <= ss && qe >= se)return st[si];if(qs > se || qe < ss )return0;int mid =getMid(ss, se);returngetSumUtil(ss, mid, qs, qe,2* si +1)+getSumUtil(mid +1, se, qs, qe,2* si +2);}publicstaticvoidmain(String args[]){int arr[]={1,3,5,7,9,11};int n = arr.length;
SegmentTree tree =newSegmentTree(arr, n);
System.out.println("Sum of values in given range = "+
tree.getSum(n,1,3));
tree.updateValue(arr, n,1,10);
System.out.println("Updated sum of values in given range = "+
tree.getSum(n,1,3));}}