假设你正在读取一串整数。每隔一段时间,你希望能找出数字 x 的秩(小于或等于 x 的值的个数)。请实现数据结构和算法来支持这些操作,也就是说:
实现 track(int x) 方法,每读入一个数字都会调用该方法;
实现 getRankOfNumber(int x) 方法,返回小于或等于 x 的值的个数。
注意:本题相对原题稍作改动
示例:
输入:
["StreamRank", "getRankOfNumber", "track", "getRankOfNumber"]
[[], [1], [0], [0]]
输出:
[null,0,null,1]
提示:
x <= 50000
track 和 getRankOfNumber 方法的调用次数均不超过 2000 次
一、常规
class StreamRank:
def __init__(self):
self.nums = []
def track(self, x: int) -> None:
self.nums.append(x)
def getRankOfNumber(self, x: int) -> int:
tem = [num for num in self.nums if num<=x]
return len(tem)
二、二叉树
每个节点添加一个保存该节点左子树上节点个数
插入数据:比当前数小的插左边,比当前树大的插右边
class TreeNode():
def __init__(self,val):
self.val = val
self.left = None
self.right = None
self.leftx = 1
class StreamRank(object):
def __init__(self):
self.root = None
def track(self, x):
if not self.root:
self.root = TreeNode(x)
else:
curnode= self.root
while True:
if curnode and x==curnode.val:
curnode.leftx+=1
break
elif x>curnode.val and curnode.right:
curnode = curnode.right
elif x<curnode.val and curnode.left:
curnode.leftx+=1
curnode = curnode.left
elif x>curnode.val and not curnode.right:
curnode.right = TreeNode(x)
break
elif x<curnode.val and not curnode.left:
curnode.leftx+=1
curnode.left = TreeNode(x)
break
def getRankOfNumber(self, x):
if not self.root:
return 0
curnode = self.root
res = 0
while True:
if x ==curnode.val:
res+=curnode.leftx
return res
if curnode and x>curnode.val and curnode.right:
res+=curnode.leftx
curnode = curnode.right
elif curnode and x<curnode.val and curnode.left:
curnode = curnode.left
elif curnode and x>curnode.val and not curnode.right:
res+=curnode.leftx
return res
elif curnode and x<curnode.val and not curnode.left:
return res