Advertisement
1988coder

307. Range Sum Query - Mutable

Dec 25th, 2018
142
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 2.38 KB | None | 0 0
  1. /*
  2. Using Segment Tree
  3.  
  4. Time Complexity:
  5. 1. NumArray = O(N)
  6. 2. update = O(log N)
  7. 3. sumRange = O(log N)
  8.  
  9. Space Complexity: O(N)
  10.  
  11. Space ranges from 2N to 4N.
  12. Refer : https://www.youtube.com/watch?v=ZBHKZF5w4YU
  13. */
  14. class NumArray {
  15.    
  16.     private class SegmentTreeNode {
  17.         int start;
  18.         int end;
  19.         int sum;
  20.         SegmentTreeNode left;
  21.         SegmentTreeNode right;
  22.        
  23.         SegmentTreeNode (int s, int e) {
  24.             start = s;
  25.             end = e;
  26.         }
  27.     }
  28.    
  29.     SegmentTreeNode root;
  30.    
  31.     public NumArray(int[] nums) {
  32.         root = buildTree(nums, 0, nums.length-1);
  33.     }
  34.    
  35.     private SegmentTreeNode buildTree(int[] nums, int s, int e) {
  36.         if (s > e) {
  37.             return null;
  38.         }
  39.         SegmentTreeNode node = new SegmentTreeNode(s, e);
  40.         if (s == e) {
  41.             node.sum = nums[s];
  42.         } else {
  43.             int mid = s + (e-s)/2;
  44.             node.left = buildTree(nums, s, mid);
  45.             node.right = buildTree(nums, mid+1, e);
  46.             node.sum = node.left.sum + node.right.sum;
  47.         }
  48.         return node;
  49.     }
  50.    
  51.     public void update(int i, int val) {
  52.         updateTree(root, i, val);
  53.     }
  54.    
  55.     private void updateTree(SegmentTreeNode node, int i, int val) {
  56.         if (node.start == node.end && node.start == i) {
  57.             node.sum = val;
  58.             return;
  59.         }
  60.         int mid = node.start + (node.end - node.start)/2;
  61.         if (i <= mid) {
  62.             updateTree(node.left, i, val);
  63.         } else {
  64.             updateTree(node.right, i, val);
  65.         }
  66.         node.sum = node.left.sum + node.right.sum;
  67.     }
  68.    
  69.     public int sumRange(int i, int j) {
  70.         return sumRange(root, i, j);
  71.     }
  72.    
  73.     private int sumRange(SegmentTreeNode node, int i , int j) {
  74.         if (node.start == i && node.end == j) {
  75.             return node.sum;
  76.         }
  77.         int mid = node.start + (node.end - node.start)/2;
  78.         if (j <= mid) {
  79.             return sumRange(node.left, i, j);
  80.         }
  81.         if (i > mid) {
  82.             return sumRange(node.right, i, j);
  83.         }
  84.         return sumRange(node.left, i, mid) + sumRange(node.right, mid+1, j);
  85.     }
  86. }
  87.  
  88. /**
  89.  * Your NumArray object will be instantiated and called as such:
  90.  * NumArray obj = new NumArray(nums);
  91.  * obj.update(i,val);
  92.  * int param_2 = obj.sumRange(i,j);
  93.  */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement