Q)给定阵列A1,A2 ... AN和K计算有多少子阵列的反转计数大于或等于K. N <= 10 ^ 5 K <= N *(N-1)/ 2
所以,我在接受采访时遇到过这个问题。我提出了形成所有子阵列的天真解决方案,其中包含两个for循环(O(n ^ 2))并使用修改的合并排序(即O(nlogn))计算数组中的反转。这导致O(n ^ 3logn)的复杂性,我猜这可以改进。任何导致我如何改善它?谢谢!
答案 0 :(得分:3)
如果我没错,可以使用两个移动指针在O(nlogn)中解决它。
从第一个元素中的左指针开始,然后移动右指针,直到你有一个带有&gt; = K 反转的子阵列。要做到这一点,您可以使用任何平衡的二进制搜索树,并且每次将指针移动到右侧时,计算树中已有多少大于此元素的元素。然后你也在树中插入元素。
当你点击已经有> gt = K 反转的点时,你知道每个具有相同起始元素的子阵列也满足限制,所以你可以全部添加它们。 / p>
然后将左指针向右移动一个位置并减去它的反转(再次,在树中查找小于它的元素)。现在你可以再次像以前那样做。
摊销分析很容易显示这是O(nlogn),因为一旦数组和树中的每个操作都是O(logn),两个指针只会遍历。