【问题标题】:Given an array A1, A2 ... AN and K, count how many subarrays have inversion count greater than or equal to K给定一个数组 A1, A2 ... AN 和 K,计算有多少子数组的反转计数大于或等于 K
【发布时间】:2015-11-08 14:13:43
【问题描述】:

Q) 给定一个数组 A1, A2 ... AN 和 K 计算有多少子数组的反转计数大于或等于 K。 N

所以,我在一次采访中遇到了这个问题。我想出了一个简单的解决方案,即用两个 for 循环 (O(n^2) ) 形成所有子数组,并使用修改后的归并排序 O(nlogn) 计算数组中的倒数。这导致了 O(n^3logn) 的复杂性,我想这可以改进。任何线索我可以如何改进它?谢谢!

【问题讨论】:

    标签: arrays algorithm


    【解决方案1】:

    如果我没记错的话,你可以用两个移动指针在 O(nlogn) 内解决它。

    从第一个元素中的左指针开始,然后移动右指针,直到您有一个具有 >= K 反转的子数组。为此,您可以使用任何平衡的二叉搜索树,并且每次将指针向右移动时,计算树中已经有多少比这个大的元素。然后你也将元素插入到树中。

    当您达到已经有 >= K 个反转的点时,您知道每个具有相同起始元素的较长子数组也满足限制,因此您可以将它们全部添加。

    然后将左指针向右移动一位并减去它的反转(再次,在树中查找比它小的元素)。现在您可以再次执行与之前相同的操作。

    摊销分析很容易表明这是 O(nlogn),因为两个指针只遍历数组一次,并且树中的每个操作都是 O(logn)。

    【讨论】:

      猜你喜欢
      • 2020-04-25
      • 1970-01-01
      • 1970-01-01
      • 2011-12-20
      • 2018-05-31
      • 1970-01-01
      • 2014-05-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多