【发布时间】:2018-06-30 11:50:59
【问题描述】:
下面给出的这个问题让我发疯。如果有人可以提供帮助,请。
“给定一个包含 'n' 个元素的数组 Num,返回一个长度为 'n' 的数组 A,其中 A[i] 在初始数组的右侧包含大于 Num[i] 的元素数”
我看到了一个 SO 答案 here,但它包含 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]
那么从小到右的count数组是[4, 3, 0, 1, 0]
大于左计数的数组为 [0, 1, 2, 2, 3]
希望这会有所帮助...
【问题讨论】:
-
还没有检查过你的代码,但是如果你能解决“将较小的元素计数到 self 的左边”,那么这不可行吗? (1) O(N) 以相反的顺序创建数组 Num2 = Num 与否定值。 (2) O(NlogN) 通过在 Num2 中计算 self 左侧的较小元素来创建数组 A2。 (3) O(N) 通过反转A2创建数组A。
-
听不懂你想说什么。做一个伪代码解释一下。
-
我无法理解你的问题,你能补充一个例子吗?
-
@WebOrNative 该问题已通过示例更新
标签: python-3.x data-structures binary-search-tree