LintCode 205 [Interval Minimum Number]

原题

给定一个整数数组(下标由 0 到 n-1,其中 n 表示数组的规模),以及一个查询列表。每一个查询列表有两个整数 [start, end]。 对于每个查询,计算出数组中从下标 start 到 end 之间的数的最小值,并返回在结果列表中。

对于数组 [1,2,7,8,5], 查询 [(1,2),(0,4),(2,4)],返回 [2,1,5]

解题思路

  • 使用线段树,典型例题
  • 首先构造node类,实现Query和Build

完整代码

"""
Definition of Interval.
class Interval(object):
    def __init__(self, start, end):
        self.start = start
        self.end = end
"""
class segmentTreeNode:
    def __init__(self, start, end, min):
        self.start, self.end, self.min = start, end, min
        self.left, self.right = None, None
        
class Solution: 
    """
    @param A, queries: Given an integer array and an Interval list
                       The ith query is [queries[i-1].start, queries[i-1].end]
    @return: The result list
    """
    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.min = min(root.left.min, root.right.min)
        return root
        
    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.min
            
        mid = root.start + (root.end - root.start) / 2
        leftMin, rightMin = sys.maxint, sys.maxint
        if start <= mid:
            if mid < end:
                leftMin = self.query(root.left, start, mid)
            else:
                leftMin = self.query(root.left, start, end)
        if mid < end:
            if start <= mid:
                rightMin = self.query(root.right, mid + 1, end)
            else:
                rightMin = self.query(root.right, start, end)
        return min(leftMin, rightMin)
        
    def intervalMinNumber(self, A, queries):
        # write your code here
        root = self.build(A)
        res = []
        for q in queries:
            res.append(self.query(root, q.start, q.end))
        return res
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一、 C/C++程序基础 面试例题1——分析代码写输出(一般赋值语句的概念和方法)。 面试例题2—...
    LuckTime阅读 2,032评论 2 42
  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,779评论 0 33
  • 第1章 认识JS JavaScript能做什么?1.增强页面动态效果(如:下拉菜单、图片轮播、信息滚动等)2.实现...
    mo默22阅读 1,349评论 0 5
  • 《ilua》速成开发手册3.0 官方用户交流:iApp开发交流(1) 239547050iApp开发交流(2) 1...
    叶染柒丶阅读 11,028评论 0 11
  • 忙碌了真正一周之后,今天算是过得比较放松了,下午的时候终于玩了两个多小时乌贼,晚上看了鲁邦三世的一部剧场版之后就继...
    钤鱼摆摆阅读 227评论 1 1