标签:use sam from his date root tps highlight insert
""" Definition of SegmentTreeNode: class SegmentTreeNode: def __init__(self, start, end): self.start, self.end = start, end self.left, self.right = None, None """ class Solution: """ @param: start: start value. @param: end: end value. @return: The root of Segment Tree. """ def build(self, start, end): # write your code here if start > end: return root = SegmentTreeNode(start, end) if start == end: return root mid = (end - start) / 2 + start root.left = self.build(start, mid) root.right = self.build(mid + 1, end) return root
""" 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: The root of segment tree. @param: start: start value. @param: end: end value. @return: The maximum number in the interval [start, end] """ def query(self, root, start, end): # write your code here if start > end: return if (start <= root.start and end >= root.end): return root.max mid = (root.end - root.start) / 2 + root.start if end <= mid: return self.query(root.left, start, end) if start > mid: return self.query(root.right, start, end) return max(self.query(root.left, start, mid), self.query(root.right, mid + 1, end))
""" 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: The root of segment tree. @param: index: index. @param: value: value @return: """ def modify(self, root, index, value): # write your code here if not root or index < root.start or index > root.end: return self.helper(root, index, value) def helper(self, root, index, value): if root.start == root.end: if root.start == index: root.max = value return root.max mid = (root.end - root.start) / 2 + root.start if index <= mid: val = self.helper(root.left, index, value) if root.right: val = max(val, root.right.max) root.max = val else: val = self.helper(root.right, index, value) if root.left: val = max(val, root.left.max) root.max = val return root.max
""" Definition of Interval. class Interval(object): def __init__(self, start, end): self.start = start self.end = end """ class SegTreeNode: def __init__(self, start, end, val): self.start, self.end, self.val = start, end, val self.left, self.right = None, None class Solution: """ @param: A: An integer array @param: queries: An query list @return: The result list """ def intervalMinNumber(self, A, queries): # write your code here if not A or not queries: return [] # 1. construct a segment tree root = self.construct_st(A, 0, len(A) - 1) # 2. search for each query res = [] for query in queries: res.append(self.query_st(root, query.start, query.end)) return res def construct_st(self, nums, start, end): if start == end: return SegTreeNode(start, end, nums[start]) mid = (end - start) / 2 + start left = self.construct_st(nums, start, mid) right = self.construct_st(nums, mid + 1, end) root = SegTreeNode(start, end, min(left.val, right.val)) root.left = left root.right = right return root def query_st(self, root, start, end): if start <= root.start and end >= root.end: return root.val root_mid = (root.end - root.start) / 2 + root.start if end <= root_mid: return self.query_st(root.left, start, end) if start > root_mid: return self.query_st(root.right, start, end) return min(self.query_st(root.left, start, root_mid), self.query_st(root.right, root_mid + 1, end))
class SegTreeNode: def __init__(self, start, end, val): self.start, self.end, self.val = start, end, val self.left, self.right = None, None class Solution: """ @param: A: An integer array @param: queries: The query list @return: The number of element in the array that are smaller that the given integer """ def countOfSmallerNumber(self, A, queries): # write your code here if not A: return [0 for i in range(len(queries))] # 1. construct a segment tree dict_A = {} for val in A: dict_A[val] = dict_A.get(val, 0) + 1 root = self.con_st(0, 10000, dict_A) # 2. search res = [] for query in queries: res.append(self.query_st(root, query)) return res def con_st(self, start, end, dict_A): if start > end: return if start == end: return SegTreeNode(start, end, dict_A.get(start, 0)) mid = (end - start) / 2 + start left = self.con_st(start, mid, dict_A) right = self.con_st(mid + 1, end, dict_A) root = SegTreeNode(start, end, left.val + right.val) root.left, root.right = left, right return root def query_st(self, root, query): if not root: return 0 if query > root.end: return root.val if query <= root.start: return 0 mid = (root.end - root.start) / 2 + root.start if query > mid: return root.left.val + self.query_st(root.right, query) if query <= mid: return self.query_st(root.left, query)
class Solution: """ @param: A: an integer array @return: A list of integers includes the index of the first number and the index of the last number """ def countOfSmallerNumberII(self, A): # write your code here if not A: return [] # binary search, O(NlogN) time(O(N^2) for insert takes O(N) each time), O(N) space sorted_subarr = [] res = [] for val in A: ind = self.binary_search(sorted_subarr, val) res.append(ind) return res def binary_search(self, sorted_subarr, val): if not sorted_subarr: sorted_subarr.append(val) return 0 # 1. find the right-most number who is smaller than val left, right = 0, len(sorted_subarr) - 1 while left < right - 1: mid = (right - left) / 2 + left if sorted_subarr[mid] < val: left = mid else: right = mid # 2. insert val into sorted_subarr if sorted_subarr[right] < val: sorted_subarr.insert(right + 1, val) return right + 1 elif sorted_subarr[left] < val: sorted_subarr.insert(left + 1, val) return left + 1 else: sorted_subarr.insert(left, val) return left
class SegTreeNode: def __init__(self, start, end, val): self.val, self.start, self.end = val, start, end self.left, self.right = None, None class Solution: """ @param: A: an integer array @return: A list of integers includes the index of the first number and the index of the last number """ def countOfSmallerNumberII(self, A): # write your code here if not A: return [] # 1. build segment tree, using O(10000log10000) root = self.build_st(0, max(A)) # 2. search for target value then update segment tree res = [] for val in A: res.append(self.search_st(root, val)) self.update_st(root, val) return res def build_st(self, start, end): root = SegTreeNode(start, end, 0) if start == end: return root mid = (end - start) / 2 + start root.left = self.build_st(start, mid) root.right = self.build_st(mid + 1, end) return root def search_st(self, root, val): if val > root.end: return root.val if val <= root.start: return 0 mid = (root.end - root.start) / 2 + root.start if val <= mid: return self.search_st(root.left, val) return root.left.val + self.search_st(root.right, val) def update_st(self, root, val): root.val += 1 if root.start == root.end: return mid = (root.end - root.start) / 2 + root.start if val <= mid: self.update_st(root.left, val) else: self.update_st(root.right, val)
[leetcode / lintcode] Tree - relative
标签:use sam from his date root tps highlight insert
原文地址:http://www.cnblogs.com/wttttt/p/7609870.html