给出的代码可以解决leetcode 307 区域和检索 - 数组可修改
题目地址:https://leetcode-cn.com/problems/range-sum-query-mutable/
实现语言是golang:
type NumArray struct {
tree []int
length int
}
func Constructor(nums []int) NumArray {
numArray := NumArray{}
if len(nums) != 0 {
buildTree(nums, &numArray)
numArray.length = len(nums)
}
return numArray
}
func buildTree(nums []int, numArray *NumArray) {
n := len(nums)
numArray.tree = make([]int, len(nums)*2)
for i, j := n, 0; i < 2*n; i, j = i+1, j+1 {
numArray.tree[i] = nums[j]
}
for i := n - 1; i > 0; i-- {
numArray.tree[i] = numArray.tree[i*2] + numArray.tree[i*2+1]
}
}
func (this *NumArray) Update(i int, val int) {
pos := this.length + i
this.tree[pos] = val
for pos > 0 {
var left = pos
var right = pos
if pos%2 == 0 {
right = pos + 1
} else {
left = pos - 1
}
this.tree[pos/2] = this.tree[left] + this.tree[right]
pos /= 2
}
}
func (this *NumArray) SumRange(i int, j int) int {
left := i + this.length
right := j + this.length
var sum = 0
for left <= right {
if left%2 == 1 {
sum += this.tree[left]
left++
}
if right%2 == 0 {
sum += this.tree[right]
right--
}
left /= 2
right /= 2
}
return sum
}