Этот вопрос, приведенный ниже, сводит меня с ума. Если кто-то может помочь, пожалуйста.
"При заданном массиве Num из 'n' элементов возвращается массив A длиной 'n', в котором A [i] содержит число элементов, превышающее Num [i] справа от него в исходном массиве"
Я видел SO-ответ здесь , но он содержит решение O (n ^ 2). Мне нужно решение O (nlogn) .
У меня есть решение для "Считать меньшие элементы слева от себя". Но его изменение не дало мне необходимого решения (см. Код ниже).
Любая помощь приветствуется:)
class BinarySearchTreeNode(object):
def __init__(self, val):
self.val = val
self.left = None
self.right = None
self.count = 1
self.leftTreeSize = 0
class BinarySearchTree(object):
def __init__(self):
self.root = None
def insert(self, val, root):
if not root:
self.root = BinarySearchTreeNode(val)
return 0
if val == root.val:
root.count += 1
return root.leftTreeSize
if val < root.val:
root.leftTreeSize += 1
if not root.left:
root.left = BinarySearchTreeNode(val)
return 0
return self.insert(val, root.left)
if not root.right:
root.right = BinarySearchTreeNode(val)
return root.count + root.leftTreeSize
return root.count + root.leftTreeSize + self.insert(val, root.right)
class Solution(object):
def countSmaller(self, nums):
tree = BinarySearchTree()
return [
tree.insert(nums[i], tree.root)
for i in range(len(nums) - 1, -1, -1)
][::-1]
print(Solution().countSmaller(nums = [1, 4, 2, 7]))
Пример:
Заданный массив [10, 7, 2, 6, 5]
, тогда меньший по размеру справа массив [4, 3, 0, 1, 0]
Массив слева направо равен [0, 1, 2, 2, 3]
Надеюсь, это поможет ...