307. 区域和检索 - 数组可修改

307. 区域和检索 - 数组可修改

解法一: 线段树

go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
type NumArray struct {
leftNumArray *NumArray
rightNumArray *NumArray
left int
right int
sum int
}

func Constructor(nums []int) NumArray {
return *dfs(nums, 0, len(nums) - 1)
}

func dfs(nums []int, left, right int) *NumArray {
if left == right {
return &NumArray{
leftNumArray: nil,
rightNumArray: nil,
left: left,
right: right,
sum: nums[left],
}
}
mid := ((right - left) >> 1) + left
leftNumArray := dfs(nums, left, mid)
rightNumArray := dfs(nums, mid + 1, right)
return &NumArray{
leftNumArray: leftNumArray,
rightNumArray: rightNumArray,
left: left,
right: right,
sum: leftNumArray.sum + rightNumArray.sum,
}
}

func queryRange(numArray *NumArray, left, right int) int {
if numArray.left == left && numArray.right == right {
return numArray.sum
}
mid := ((numArray.right - numArray.left) >> 1) + numArray.left
if left > mid {
return queryRange(numArray.rightNumArray, left, right)
} else if right <= mid {
return queryRange(numArray.leftNumArray, left, right)
}
return queryRange(numArray.leftNumArray, left, mid) + queryRange(numArray.rightNumArray, mid + 1, right)
}

func updateRange(numArray *NumArray, left, right, val int) *NumArray {
if numArray.left == numArray.right && numArray.left == left {
numArray.sum = val
return numArray
}
mid := ((numArray.right - numArray.left) >> 1) + numArray.left
if left > mid {
updateRange(numArray.rightNumArray, left, right, val)
} else if right <= mid {
updateRange(numArray.leftNumArray, left, right, val)
} else {
updateRange(numArray.leftNumArray, left, mid, val)
updateRange(numArray.rightNumArray, mid + 1, right, val)
}
numArray.sum = numArray.leftNumArray.sum + numArray.rightNumArray.sum
return numArray
}

func (this *NumArray) Update(index int, val int) {
updateRange(this, index, index, val)
}

func (this *NumArray) SumRange(left int, right int) int {
return queryRange(this, left, right)
}

/**
* Your NumArray object will be instantiated and called as such:
* obj := Constructor(nums);
* obj.Update(index,val);
* param_2 := obj.SumRange(left,right);
*/
作者

wuhunyu

发布于

2023-11-13

更新于

2023-11-13

许可协议