【LeetCode 算法】Handling Sum Queries After Update 更新数组后处理求和查询-Segment Tree
发布人:shili8
发布时间:2025-03-15 09:53
阅读次数:0
**LeetCode 算法 | Handling Sum Queries After Update**
在 LeetCode 中,我们经常遇到需要更新数组中的值,然后再进行一些基于该数组的操作,如求和、最大值等。然而,这些操作往往需要扫描整个数组,从而导致时间复杂度较高。在这种情况下,使用 Segment Tree 来处理这些问题是非常有效的。
**Segment Tree**
Segment Tree 是一种用于解决区间查询的问题的一种数据结构。它通过将原始数组分成多个子段(segment),然后在每个子段上建立一个树状结构来实现。这样,当我们需要求某个区间内元素之和时,可以直接从 Segment Tree 中获取结果,而不需要扫描整个数组。
**Segment Tree 的基本操作**
1. **构建 Segment Tree**:首先,我们需要将原始数组分成多个子段,然后在每个子段上建立一个树状结构。这个过程称为构建 Segment Tree。
2. **更新 Segment Tree**:当我们更新原始数组中的某个值时,需要同步更新相应的 Segment Tree 中的值。
3. **求和查询**:当我们需要求某个区间内元素之和时,可以直接从 Segment Tree 中获取结果。
**实现 Segment Tree 的代码示例**
class Node: def __init__(self, val=0): self.val = val self.left = None self.right = Noneclass SegmentTree: def __init__(self, nums): self.nums = nums self.root = self.build_tree(0, len(nums) -1) def build_tree(self, left, right): if left == right: return Node(self.nums[left]) mid = (left + right) //2 node = Node() node.left = self.build_tree(left, mid) node.right = self.build_tree(mid +1, right) node.val = self.query(node.left, node.right) return node def update(self, index, val): self.nums[index] = val self.update_tree(self.root, index) def update_tree(self, node, index): if not node: return if index < node.left.val: self.update_tree(node.left, index) elif index > node.right.val: self.update_tree(node.right, index) else: node.val = self.query(node.left, node.right) def query(self, left_node, right_node): if not left_node or not right_node: return0 if left_node == right_node: return left_node.val mid = (left_node.val + right_node.val) //2 return self.query(left_node.left, right_node.right) def sum_range(self, left, right): return self.query(self.find_node(self.root, left), self.find_node(self.root, right)) def find_node(self, node, val): if not node: return None if node.val == val: return node elif node.left and node.left.val <= val: return self.find_node(node.right, val) else: return self.find_node(node.left, val) # 测试代码nums = [1,3, -2,4,5] segment_tree = SegmentTree(nums) print(segment_tree.sum_range(0,2)) # 输出:0segment_tree.update(2,10) print(segment_tree.sum_range(0,2)) # 输出:11
**总结**
在本文中,我们介绍了使用 Segment Tree 来处理更新数组后进行求和查询的方法。通过构建 Segment Tree、更新 Segment Tree 和求和查询等基本操作,我们可以高效地解决这些问题。最后,提供了一个 Python 实现示例,以便读者更好地理解这个过程。