原題
對于一個有n個數(shù)的整數(shù)數(shù)組,在對應(yīng)的線段樹中, 根節(jié)點(diǎn)所代表的區(qū)間為0-n-1, 每個節(jié)點(diǎn)有一個額外的屬性max,值為該節(jié)點(diǎn)所代表的數(shù)組區(qū)間start到end內(nèi)的最大值。
為SegmentTree設(shè)計(jì)一個 query 的方法,接受3個參數(shù)root, start和end,線段樹root所代表的數(shù)組中子區(qū)間[start, end]內(nèi)的最大值。
對于數(shù)組 [1, 4, 2, 3], 對應(yīng)的線段樹為:
[0, 3, max=4]
/ \
[0,1,max=4] [2,3,max=3]
/ \ / \
[0,0,max=1] [1,1,max=4] [2,2,max=2], [3,3,max=3]
query(root, 1, 1), return 4
query(root, 1, 2), return 4
query(root, 2, 3), return 3
query(root, 0, 2), return 4
解題思路
- 本題為下標(biāo)型線段樹的Query
- 如果查詢區(qū)間 == 節(jié)點(diǎn)表示區(qū)間 => 直接返回root.max
- 如果查詢區(qū)間被節(jié)點(diǎn)表示的左/右區(qū)間包含 => 遞歸搜索左/右區(qū)間
- 如果查詢區(qū)間和結(jié)點(diǎn)表示的區(qū)間相交不相等 => 分裂遞歸搜索左/右區(qū)間
- 典型的divide & conquer
- 最后返回max(leftMax, rightMax)
完整代碼
"""
Definition of SegmentTreeNode:
class SegmentTreeNode:
def __init__(self, start, end, max):
self.start, self.end, self.max = start, end, max
self.left, self.right = None, None
"""
class Solution:
# @param root, start, end: The root of segment tree and
# an segment / interval
# @return: The maximum number in the interval [start, end]
def query(self, root, start, end):
if start > end or root == None:
return - sys.maxint
if root.start >= start and root.end <= end:
return root.max
mid = root.start + (root.end - root.start) / 2
leftMax, rightMax = - sys.maxint - 1, - sys.maxint - 1
if start <= mid:
if mid < end:
leftMax = self.query(root.left, start, mid)
else:
leftMax = self.query(root.left, start, end)
if mid < end:
if start <= mid:
rightMax = self.query(root.right, mid + 1, end)
else:
rightMax = self.query(root.right, start, end)
return max(leftMax, rightMax)