LintCode 439 [Segment Tree Build II]

1650 ワード

原題


セグメントツリーは、ノードが表す区間を表す2つの追加のプロパティstartとendを含む2つのツリーです.startおよびendは整数であり、ルートノードのstartおよびendはbuildメソッドによって与えられる.ノードAの左の息子にはstart=A.left,end=(A.left+A.right)/2がある.ノードAの右の息子にはstart=(A.left+A.right)/2+1,end=A.rightがある.startがendに等しい場合、このノードは葉ノードであり、左右の息子はいない.パラメータとしてstartとendを受け入れるbuildメソッドを実装し、各ノードがこの区間の最大値を含み、このセグメントツリーのルートを返す区間[start,end]を表すセグメントツリーを構築します.
[3,2,1,4]を与える.対応する線分ツリーは次のとおりです.
                 [0,  3] (max = 4)
                  /            \
        [0,  1] (max = 3)     [2, 3]  (max = 4)
        /        \               /             \
[0, 0](max = 3)  [1, 1](max = 2)[2, 2](max = 1) [3, 3] (max = 4)

問題を解く構想.

  • 上から下へ、再帰分裂
  • 下から上へ、遡及更新
  • 完全なコード

    """
    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: 
        # @oaram A: a list of integer
        # @return: The root of Segment Tree
        def build(self, A):
            if not A:
                return None
            
            return self.helper(A, 0, len(A) - 1)
    
        def helper(self, L, start, end):
            if start == end:
                root = SegmentTreeNode(start, end, L[start])
                return root
                
            root = SegmentTreeNode(start, end, 0)
            if start != end:
                mid = (start + end) / 2
                root.left = self.helper(L, start, mid)
                root.right = self.helper(L, mid + 1, end)
            root.max = max(root.left.max, root.right.max)
            return root