当前位置:实例文章 » JAVA Web实例» [文章]【LeetCode 算法】Handling Sum Queries After Update 更新数组后处理求和查询-Segment Tree

【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 实现示例,以便读者更好地理解这个过程。

其他信息

其他资源

Top