# LintCode 249 [Count the Smaller Number before itself]

### 解题思路

• 建立值型线段树
• 首先建立树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