diff --git a/README.md b/README.md
index 120e6eb..c029098 100644
--- a/README.md
+++ b/README.md
@@ -114,6 +114,7 @@ continually updating 😃.
* [226. Invert Binary Tree](src/0226_invert_binary_tree/invert_binary_tree.go) *`binary tree;`*
* [235. Lowest Common Ancestor of a Binary Search Tree](src/0235_lowest_common_ancestor_of_a_binary_search_tree/lcaoabst.go) *`binary tree;`*
* [257. Binary Tree Paths](src/0257_binary_tree_paths/binary_tree_paths.go) *`binary tree`*
+* [307. Range Sum Query - Mutable](src/0307_Range_Sum_Query_Mutable/range_sum_query_mut.go) *`segment tree`*
* [404. Sum of Left Leaves](src/0404_sum_of_left_leaves/sum_of_left_leaves.go) *`binary tree`*
* [437. Path Sum III](src/0437_path_sum_3/path_sum_3.go) *`binary tree`*
* [872. Leaf-Similar Trees](src/0872_leaf_similar_trees/leaf_similar_trees.go) *`binary tree`*
diff --git a/src/0307_Range_Sum_Query_Mutable/range_sum_query_mut.go b/src/0307_Range_Sum_Query_Mutable/range_sum_query_mut.go
new file mode 100644
index 0000000..0b584fc
--- /dev/null
+++ b/src/0307_Range_Sum_Query_Mutable/range_sum_query_mut.go
@@ -0,0 +1,88 @@
+/*
+307. Range Sum Query - Mutable
+https://leetcode.com/problems/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.
+
+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.
+*/
+// time: 2019年01月29日
+// 线段树时间复杂度为:O(log n)
+
+package rsqm
+
+// NumArray 线段树
+type NumArray struct {
+ segmentTree []int
+ data []int
+}
+
+// Constructor 线段树生成函数
+func Constructor(nums []int) NumArray {
+ na := NumArray{segmentTree: make([]int, len(nums)*4), data: nums[:]}
+ na.buildSegmentTree(0, 0, len(na.data)-1)
+ return na
+}
+
+func (na *NumArray) buildSegmentTree(treeIndex, left, right int) {
+ // 线段树处理的数据不能为空。
+ //if right < left { + // return + //} + if left == right { + na.segmentTree[treeIndex] = na.data[left] + return + } + mid := left + (right-left)>>1
+ leftTreeIndex := 2*treeIndex + 1
+ rightTreeIndex := 2*treeIndex + 2
+ na.buildSegmentTree(leftTreeIndex, left, mid)
+ na.buildSegmentTree(rightTreeIndex, mid+1, right)
+ na.segmentTree[treeIndex] = na.segmentTree[leftTreeIndex] + na.segmentTree[rightTreeIndex]
+}
+
+// Update 线段树更新操作。
+func (na *NumArray) Update(i int, val int) {
+ na.setter(0, 0, len(na.data)-1, i, val)
+}
+
+func (na *NumArray) setter(treeIndex, left, right, index, val int) {
+ if left == right {
+ na.segmentTree[treeIndex] = val
+ return
+ }
+ mid := left + (right-left)>>1
+ leftTreeIndex := 2*treeIndex + 1
+ rightTreeIndex := 2*treeIndex + 2
+ if index>= mid+1 {
+ na.setter(rightTreeIndex, mid+1, right, index, val)
+ } else {
+ na.setter(leftTreeIndex, left, mid, index, val)
+ }
+ na.segmentTree[treeIndex] = na.segmentTree[leftTreeIndex] + na.segmentTree[rightTreeIndex]
+}
+
+// SumRange 线段树查询
+func (na *NumArray) SumRange(i int, j int) int {
+ return na.query(0, 0, len(na.data)-1, i, j)
+}
+
+func (na *NumArray) query(treeIndex, left, right, queryL, queryR int) int {
+ if left == queryL && right == queryR {
+ return na.segmentTree[treeIndex]
+ }
+ mid := left + (right-left)>>1
+ leftTreeIndex := 2*treeIndex + 1
+ rightTreeIndex := 2*treeIndex + 2
+ if queryL>= mid+1 {
+ return na.query(rightTreeIndex, mid+1, right, queryL, queryR)
+ } else if queryR <= mid { + return na.query(leftTreeIndex, left, mid, queryL, queryR) + } else { + return na.query(leftTreeIndex, left, mid, queryL, mid) + na.query(rightTreeIndex, mid+1, right, mid+1, queryR) + } +} diff --git a/src/0307_Range_Sum_Query_Mutable/range_sum_query_mut_test.go b/src/0307_Range_Sum_Query_Mutable/range_sum_query_mut_test.go new file mode 100644 index 0000000..ae766ef --- /dev/null +++ b/src/0307_Range_Sum_Query_Mutable/range_sum_query_mut_test.go @@ -0,0 +1,15 @@ +package rsqm + +import "testing" + +func TestNumArray(t *testing.T) { + nums := []int{1, 2, 3, 6, 7, 8, 9, 3, 4, 2, 5} + na := Constructor(nums) + if res := na.SumRange(4, 9); res != 33 { + t.Errorf("expected %d, got %d", 43, res) + } + na.Update(6, 10) + if res := na.SumRange(4, 9); res != 34 { + t.Errorf("expected %d, got %d", 44, res) + } +} diff --git a/src/README.md b/src/README.md index b4f99e6..c41f8af 100644 --- a/src/README.md +++ b/src/README.md @@ -80,6 +80,7 @@ |0283|[Move Zeroes(solution1)](./0283_move_zeroes/move_zeroes.go)
[Move Zeroes(solution2)](./0283_move_zeroes/move_zeroes2.go)|Easy|*`array`*|
|0300|[Longest Increasing Subsequence](./0300_longest_increasing_subsequence/lis.go)|Medium|*`dp`*|
|0303|[303. Range Sum Query - Immutable](0303_range_sum_query/rsqim.go)|Easy||
+|0307|[307. Range Sum Query - Mutable](0307_Range_Sum_Query_Mutable/range_sum_query_mut.go)|Medium|*`segment tree`*|
|0328|[328. Odd Even Linked List](0328_odd_even_linked_list/odd_even_linked_list.go)|Medium|*`singly linked list`*|
|0343|[Integer Break](./0343_integer_break/integer_break.go)|Medium|*`recursion;`* *`memory search;`* *`dynamic programming`*|
|0344|[344. Reverse String](0344_reverse_string/reverse_string.go)|Easy|*`double index`*|