【发布时间】:2015-11-08 14:13:43
【问题描述】:
Q) 给定一个数组 A1, A2 ... AN 和 K 计算有多少子数组的反转计数大于或等于 K。 N
所以,我在一次采访中遇到了这个问题。我想出了一个简单的解决方案,即用两个 for 循环 (O(n^2) ) 形成所有子数组,并使用修改后的归并排序 O(nlogn) 计算数组中的倒数。这导致了 O(n^3logn) 的复杂性,我想这可以改进。任何线索我可以如何改进它?谢谢!
【问题讨论】:
Q) 给定一个数组 A1, A2 ... AN 和 K 计算有多少子数组的反转计数大于或等于 K。 N
所以,我在一次采访中遇到了这个问题。我想出了一个简单的解决方案,即用两个 for 循环 (O(n^2) ) 形成所有子数组,并使用修改后的归并排序 O(nlogn) 计算数组中的倒数。这导致了 O(n^3logn) 的复杂性,我想这可以改进。任何线索我可以如何改进它?谢谢!
【问题讨论】:
如果我没记错的话,你可以用两个移动指针在 O(nlogn) 内解决它。
从第一个元素中的左指针开始,然后移动右指针,直到您有一个具有 >= K 反转的子数组。为此,您可以使用任何平衡的二叉搜索树,并且每次将指针向右移动时,计算树中已经有多少比这个大的元素。然后你也将元素插入到树中。
当您达到已经有 >= K 个反转的点时,您知道每个具有相同起始元素的较长子数组也满足限制,因此您可以将它们全部添加。
然后将左指针向右移动一位并减去它的反转(再次,在树中查找比它小的元素)。现在您可以再次执行与之前相同的操作。
摊销分析很容易表明这是 O(nlogn),因为两个指针只遍历数组一次,并且树中的每个操作都是 O(logn)。
【讨论】: