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); */
|