给定一个整数数组 nums,求出数组从索引 i 到 j (i ≤ j) 范围内元素的总和,包含 i, j 两点。
update(i, val) 函数可以通过将下标为 i 的数值更新为 val,从而对数列进行修改。
示例:
Given nums = [1, 3, 5] sumRange(0, 2) -> 9 update(1, 2) sumRange(0, 2) -> 8
说明:
- 数组仅可以在 update 函数下进行修改。
- 你可以假设 update 函数与 sumRange 函数的调用次数是均匀分布的。
正常的思路容易想到每次求和的时间复杂度为O(n), 更新数组元素的时间复杂度为O(1), 因此总体的时间复杂度为 O(n)。但是通过使用segment tree可以将求和以及更新数组元素操作的时间复杂度均变为 O(log2n)。
Segment Tree是一棵二叉树,其特点为叶子节点个数与数组的长度相同 从左到右依次为数组中下标从小到大的元素的值,父节点的值为其左右的叶子节点的值的和。如下图是一个简单的例子
因此可以看到每个非叶子节点的值均是代表了数组某个区间的和。
1 | class NumArray(object): |