Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

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

Lines changed: 1 addition & 0 deletions
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`*
Lines changed: 88 additions & 0 deletions
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+
}
Lines changed: 15 additions & 0 deletions
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

Lines changed: 1 addition & 0 deletions
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)

AltStyle によって変換されたページ (->オリジナル) /