1
1
package com .fishercoder .solutions ;
2
2
3
- /**Given an integer array nums, find the sum of the elements between indices i and j (i ≤ j), inclusive.
3
+ /**
4
+ * 307. Range Sum Query - Mutable
5
+ *
6
+ * Given an integer array nums, find the sum of the elements between indices i and j (i ≤ j), inclusive.
4
7
5
8
The update(i, val) function modifies nums by updating the element at index i to val.
6
9
Example:
@@ -11,92 +14,85 @@ The update(i, val) function modifies nums by updating the element at index i to
11
14
sumRange(0, 2) -> 8
12
15
Note:
13
16
The array is only modifiable by the update function.
14
- You may assume the number of calls to update and sumRange function is distributed evenly.*/
17
+ You may assume the number of calls to update and sumRange function is distributed evenly.
18
+ */
15
19
public class _307 {
16
20
17
- public static void main (String ... strings ) {
18
- // int[] nums = new int[]{1,3,5};
21
+ public static class Solution1 {
22
+ class NumArray {
23
+ class SegmentTreeNode {
24
+ SegmentTreeNode left ;
25
+ SegmentTreeNode right ;
26
+ int start ;
27
+ int end ;
28
+ int sum ;
19
29
20
- int [] nums = new int [] { 7 , 2 , 7 , 2 , 0 };
21
- NumArray test = new NumArray (nums );
22
- test .update (4 , 6 );
23
- test .update (0 , 2 );
24
- test .update (0 , 9 );
25
- }
26
-
27
- private static class NumArray {
28
- class SegmentTreeNode {
29
- SegmentTreeNode left ;
30
- SegmentTreeNode right ;
31
- int start ;
32
- int end ;
33
- int sum ;
34
-
35
- public SegmentTreeNode (int start , int end ) {
36
- this .start = start ;
37
- this .end = end ;
38
- this .left = null ;
39
- this .right = null ;
40
- this .sum = 0 ;
30
+ public SegmentTreeNode (int start , int end ) {
31
+ this .start = start ;
32
+ this .end = end ;
33
+ this .left = null ;
34
+ this .right = null ;
35
+ this .sum = 0 ;
36
+ }
41
37
}
42
- }
43
38
44
- private SegmentTreeNode root = null ;
39
+ private SegmentTreeNode root = null ;
45
40
46
- public NumArray (int [] nums ) {
47
- root = buildSegmentTree (nums , 0 , nums .length - 1 );
48
- }
41
+ public NumArray (int [] nums ) {
42
+ root = buildSegmentTree (nums , 0 , nums .length - 1 );
43
+ }
49
44
50
- SegmentTreeNode buildSegmentTree (int [] nums , int start , int end ) {
51
- if (start > end ) {
52
- return null ;
53
- } else {
54
- SegmentTreeNode root = new SegmentTreeNode (start , end );
55
- if (start == end ) {
56
- root .sum = nums [start ];
45
+ SegmentTreeNode buildSegmentTree (int [] nums , int start , int end ) {
46
+ if (start > end ) {
47
+ return null ;
57
48
} else {
58
- int mid = start + (end - start ) / 2 ;
59
- root .left = buildSegmentTree (nums , start , mid );
60
- root .right = buildSegmentTree (nums , mid + 1 , end );
61
- root .sum = root .left .sum + root .right .sum ;
49
+ SegmentTreeNode root = new SegmentTreeNode (start , end );
50
+ if (start == end ) {
51
+ root .sum = nums [start ];
52
+ } else {
53
+ int mid = start + (end - start ) / 2 ;
54
+ root .left = buildSegmentTree (nums , start , mid );
55
+ root .right = buildSegmentTree (nums , mid + 1 , end );
56
+ root .sum = root .left .sum + root .right .sum ;
57
+ }
58
+ return root ;
62
59
}
63
- return root ;
64
60
}
65
- }
66
61
67
- void update (int i , int val ) {
68
- update (root , i , val );
69
- }
62
+ void update (int i , int val ) {
63
+ update (root , i , val );
64
+ }
70
65
71
- void update (SegmentTreeNode root , int pos , int val ) {
72
- if (root .start == root .end ) {
73
- root .sum = val ;
74
- } else {
75
- int mid = root .start + (root .end - root .start ) / 2 ;
76
- if (pos <= mid ) {
77
- update (root .left , pos , val );
66
+ void update (SegmentTreeNode root , int pos , int val ) {
67
+ if (root .start == root .end ) {
68
+ root .sum = val ;
78
69
} else {
79
- update (root .right , pos , val );
70
+ int mid = root .start + (root .end - root .start ) / 2 ;
71
+ if (pos <= mid ) {
72
+ update (root .left , pos , val );
73
+ } else {
74
+ update (root .right , pos , val );
75
+ }
76
+ root .sum = root .left .sum + root .right .sum ;
80
77
}
81
- root .sum = root .left .sum + root .right .sum ;
82
78
}
83
- }
84
79
85
- public int sumRange (int i , int j ) {
86
- return sumRange (root , i , j );
87
- }
80
+ public int sumRange (int i , int j ) {
81
+ return sumRange (root , i , j );
82
+ }
88
83
89
- int sumRange (SegmentTreeNode root , int start , int end ) {
90
- if (root .end == end && root .start == start ) {
91
- return root .sum ;
92
- } else {
93
- int mid = root .start + (root .end - root .start ) / 2 ;
94
- if (end <= mid ) {
95
- return sumRange (root .left , start , end );
96
- } else if (start >= mid + 1 ) {
97
- return sumRange (root .right , start , end );
84
+ int sumRange (SegmentTreeNode root , int start , int end ) {
85
+ if (root .end == end && root .start == start ) {
86
+ return root .sum ;
98
87
} else {
99
- return sumRange (root .right , mid + 1 , end ) + sumRange (root .left , start , mid );
88
+ int mid = root .start + (root .end - root .start ) / 2 ;
89
+ if (end <= mid ) {
90
+ return sumRange (root .left , start , end );
91
+ } else if (start >= mid + 1 ) {
92
+ return sumRange (root .right , start , end );
93
+ } else {
94
+ return sumRange (root .right , mid + 1 , end ) + sumRange (root .left , start , mid );
95
+ }
100
96
}
101
97
}
102
98
}
0 commit comments