我偶然发现了向左侧找到不同元素的数量并且小于数组中每个位置的元素的问题。
示例:
对于数组1 1 2 4 5 3 6
,答案为0 0 1 2 3 2 5
直接解决O(n 2 )中的问题,我想知道问题是否可以在O(n * lg(n))中解决。
答案 0 :(得分:7)
是的,您可以将元素插入到平衡(红黑,AVG,无论如何)二进制搜索树中,在每个节点中存储总子树节点数。更新是O(log N),因为您只沿着root的路径更新,并且检查不同元素的数量也是O(log N),因为它需要将从新元素到的路径上的左子树的nodecount相加根
这是插入[0,1,2,3,5,6]后树看起来的样子,子树节点计算在括号中。
2(6)
/ \
1(2) 5(3)
/ / \
0(1) 3(1)6(1)
插入6(假设它是最后一个)时,添加:
总计5.树有点太小,无法看到保留总数的节省,但请注意,您不需要访问0节点,它在其父节点 - 1节点中占用。