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`*|