Skip to content

Commit b64da5f

Browse files
authored
307 solved (#71)
* 307 solved * add more ut case for 307
1 parent 65db02d commit b64da5f

File tree

4 files changed

+105
-0
lines changed

4 files changed

+105
-0
lines changed

README.md

+1
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,7 @@ continually updating 😃.
114114
* [226. Invert Binary Tree](src/0226_invert_binary_tree/invert_binary_tree.go)   *`binary tree;`*
115115
* [235. Lowest Common Ancestor of a Binary Search Tree](src/0235_lowest_common_ancestor_of_a_binary_search_tree/lcaoabst.go)   *`binary tree;`*
116116
* [257. Binary Tree Paths](src/0257_binary_tree_paths/binary_tree_paths.go)   *`binary tree`*
117+
* [307. Range Sum Query - Mutable](src/0307_Range_Sum_Query_Mutable/range_sum_query_mut.go)   *`segment tree`*
117118
* [404. Sum of Left Leaves](src/0404_sum_of_left_leaves/sum_of_left_leaves.go)   *`binary tree`*
118119
* [437. Path Sum III](src/0437_path_sum_3/path_sum_3.go)   *`binary tree`*
119120
* [872. Leaf-Similar Trees](src/0872_leaf_similar_trees/leaf_similar_trees.go)   *`binary tree`*
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
/*
2+
307. Range Sum Query - Mutable
3+
https://leetcode.com/problems/range-sum-query-mutable/
4+
5+
Given an integer array nums, find the sum of the elements between indices i and j (i ≤ j), inclusive.
6+
7+
The update(i, val) function modifies nums by updating the element at index i to val.
8+
9+
Note:
10+
The array is only modifiable by the update function.
11+
You may assume the number of calls to update and sumRange function is distributed evenly.
12+
*/
13+
// time: 2019-01-29
14+
// 线段树时间复杂度为:O(log n)
15+
16+
package rsqm
17+
18+
// NumArray 线段树
19+
type NumArray struct {
20+
segmentTree []int
21+
data []int
22+
}
23+
24+
// Constructor 线段树生成函数
25+
func Constructor(nums []int) NumArray {
26+
na := NumArray{segmentTree: make([]int, len(nums)*4), data: nums[:]}
27+
na.buildSegmentTree(0, 0, len(na.data)-1)
28+
return na
29+
}
30+
31+
func (na *NumArray) buildSegmentTree(treeIndex, left, right int) {
32+
// 线段树处理的数据不能为空。
33+
//if right < left {
34+
// return
35+
//}
36+
if left == right {
37+
na.segmentTree[treeIndex] = na.data[left]
38+
return
39+
}
40+
mid := left + (right-left)>>1
41+
leftTreeIndex := 2*treeIndex + 1
42+
rightTreeIndex := 2*treeIndex + 2
43+
na.buildSegmentTree(leftTreeIndex, left, mid)
44+
na.buildSegmentTree(rightTreeIndex, mid+1, right)
45+
na.segmentTree[treeIndex] = na.segmentTree[leftTreeIndex] + na.segmentTree[rightTreeIndex]
46+
}
47+
48+
// Update 线段树更新操作。
49+
func (na *NumArray) Update(i int, val int) {
50+
na.setter(0, 0, len(na.data)-1, i, val)
51+
}
52+
53+
func (na *NumArray) setter(treeIndex, left, right, index, val int) {
54+
if left == right {
55+
na.segmentTree[treeIndex] = val
56+
return
57+
}
58+
mid := left + (right-left)>>1
59+
leftTreeIndex := 2*treeIndex + 1
60+
rightTreeIndex := 2*treeIndex + 2
61+
if index >= mid+1 {
62+
na.setter(rightTreeIndex, mid+1, right, index, val)
63+
} else {
64+
na.setter(leftTreeIndex, left, mid, index, val)
65+
}
66+
na.segmentTree[treeIndex] = na.segmentTree[leftTreeIndex] + na.segmentTree[rightTreeIndex]
67+
}
68+
69+
// SumRange 线段树查询
70+
func (na *NumArray) SumRange(i int, j int) int {
71+
return na.query(0, 0, len(na.data)-1, i, j)
72+
}
73+
74+
func (na *NumArray) query(treeIndex, left, right, queryL, queryR int) int {
75+
if left == queryL && right == queryR {
76+
return na.segmentTree[treeIndex]
77+
}
78+
mid := left + (right-left)>>1
79+
leftTreeIndex := 2*treeIndex + 1
80+
rightTreeIndex := 2*treeIndex + 2
81+
if queryL >= mid+1 {
82+
return na.query(rightTreeIndex, mid+1, right, queryL, queryR)
83+
} else if queryR <= mid {
84+
return na.query(leftTreeIndex, left, mid, queryL, queryR)
85+
} else {
86+
return na.query(leftTreeIndex, left, mid, queryL, mid) + na.query(rightTreeIndex, mid+1, right, mid+1, queryR)
87+
}
88+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package rsqm
2+
3+
import "testing"
4+
5+
func TestNumArray(t *testing.T) {
6+
nums := []int{1, 2, 3, 6, 7, 8, 9, 3, 4, 2, 5}
7+
na := Constructor(nums)
8+
if res := na.SumRange(4, 9); res != 33 {
9+
t.Errorf("expected %d, got %d", 43, res)
10+
}
11+
na.Update(6, 10)
12+
if res := na.SumRange(4, 9); res != 34 {
13+
t.Errorf("expected %d, got %d", 44, res)
14+
}
15+
}

src/README.md

+1
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@
8080
|0283|[Move Zeroes(solution1)](./0283_move_zeroes/move_zeroes.go) <br/> [Move Zeroes(solution2)](./0283_move_zeroes/move_zeroes2.go)|Easy|*`array`*|
8181
|0300|[Longest Increasing Subsequence](./0300_longest_increasing_subsequence/lis.go)|Medium|*`dp`*|
8282
|0303|[303. Range Sum Query - Immutable](0303_range_sum_query/rsqim.go)|Easy||
83+
|0307|[307. Range Sum Query - Mutable](0307_Range_Sum_Query_Mutable/range_sum_query_mut.go)|Medium|*`segment tree`*|
8384
|0328|[328. Odd Even Linked List](0328_odd_even_linked_list/odd_even_linked_list.go)|Medium|*`singly linked list`*|
8485
|0343|[Integer Break](./0343_integer_break/integer_break.go)|Medium|*`recursion;`* *`memory search;`* *`dynamic programming`*|
8586
|0344|[344. Reverse String](0344_reverse_string/reverse_string.go)|Easy|*`double index`*|

0 commit comments

Comments
 (0)