LintCode 249 [Count the Smaller Number before itself]

原题

给定一个整数数组(下标由 0 到 n-1, n 表示数组的规模,取值范围由 0 到10000)。对于数组中的每个 ai 元素,请计算 ai 前的数中比它小的元素的数量。

对于数组[1,2,7,8,5] ,返回 [0,1,2,3,2]

解题思路

  • 建立值型线段树
  • 首先建立树count都等于0,然后循环query再modify
  • 注意查找x-1可能出现负值,要做判断,x-1 < 0直接res.append(0)

完整代码

class segmentTreeNode:
    def __init__(self, start, end, count):
        self.start, self.end, self.count = start, end, count
        self.left, self.right = None, None
  
class Solution:
    """
    @param A: A list of integer
    @return: Count the number of element before this element 'ai' is 
             smaller than it and return count number list
    """
    def build(self, start, end):
        if start == end:
            root = segmentTreeNode(start, end, 0)
            return root
            
        root = segmentTreeNode(start, end, 0)
        if start != end:
            mid = (start + end) / 2
            root.left = self.build(start, mid)
            root.right = self.build(mid + 1, end)
        return root
        
    def query(self, root, start, end):
        if root.start == start and root.end == end:
            return root.count
            
        mid = root.start + (root.end - root.start) / 2
        leftCount, rightCount = 0, 0
        if start <= mid:
            if mid < end:
                leftCount = self.query(root.left, start, mid)
            else:
                leftCount = self.query(root.left, start, end)
        if mid < end:
            if start <= mid:
                rightCount = self.query(root.right, mid + 1, end)
            else:
                rightCount = self.query(root.right, start, end)
        return leftCount + rightCount
        
    def modify(self, root, index, value):
        if root.start == index and root.end == index:
            root.count += value
            return
        
        mid = root.start + (root.end - root.start) / 2
        if root.start <= index and index <= mid:
            self.modify(root.left, index, value)
        
        if mid < index and index <= root.end:
            self.modify(root.right, index, value)
        
        root.count = root.left.count + root.right.count
        
    def countOfSmallerNumberII(self, A):
        root = self.build(0, 10000)
        
        res = []
        for num in A:
            ans = 0
            if num > 0:
                ans = self.query(root, 0, num - 1)
            self.modify(root, num, 1)
            res.append(ans)
        
        return res

推荐阅读更多精彩内容

  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 11,966评论 0 33
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 124,758评论 18 136
  • 1 序 2016年6月25日夜,帝都,天下着大雨,拖着行李箱和同学在校门口照了最后一张合照,搬离寝室打车去了提前租...
    RichardJieChen阅读 4,413评论 0 12
  • 计算机二级C语言上机题库(南开版) 1.m个人的成绩存放在score数组中,请编写函数fun,它的功能是:将低于平...
    MrSunbeam阅读 5,028评论 1 42
  • 这本书是关于哈罗德耗时87天、徒步627英里的故事。 “朝圣者”哈罗德,65岁,已退休,普通得比你我还要沧海一粟。...
    珠玉珠玉阅读 295评论 4 7
  • 背景 “白熊”现象是哈佛大学心理学教授丹尼尔·韦格纳对其学生做的实验,他告诉被试者,他们可以想任何事情,但就是不要...
    Fly_Catkin阅读 49评论 0 0
  • 一个人总要走陌生的路 看陌生的风景 听陌生的歌 然后在某个不经意的瞬间 你会发现 原本费尽心机想要忘记的事情 真的...
    情非得已i阅读 124评论 0 2