给定阵列A1,A2 ... AN和K,计算有多少子阵列具有大于或等于K的反转计数

时间:2015-11-08 14:13:43

标签: arrays algorithm

Q)给定阵列A1,A2 ... AN和K计算有多少子阵列的反转计数大于或等于K. N <= 10 ^ 5 K <= N *(N-1)/ 2

所以,我在接受采访时遇到过这个问题。我提出了形成所有子阵列的天真解决方案,其中包含两个for循环(O(n ^ 2))并使用修改的合并排序(即O(nlogn))计算数组中的反转。这导致O(n ^ 3logn)的复杂性,我猜这可以改进。任何导致我如何改善它?谢谢!

1 个答案:

答案 0 :(得分:3)

如果我没错,可以使用两个移动指针在O(nlogn)中解决它。

从第一个元素中的左指针开始,然后移动右指针,直到你有一个带有&gt; = K 反转的子阵列。要做到这一点,您可以使用任何平衡的二进制搜索树,并且每次将指针移动到右侧时,计算树中已有多少大于此元素的元素。然后你也在树中插入元素。

当你点击已经有> gt = K 反转的点时,你知道每个具有相同起始元素的子阵列也满足限制,所以你可以全部添加它们。 / p>

然后将左指针向右移动一个位置并减去它的反转(再次,在树中查找小于它的元素)。现在你可以再次像以前那样做。

摊销分析很容易显示这是O(nlogn),因为一旦数组和树中的每个操作都是O(logn),两个指针只会遍历。