查找对数组

时间:2017-01-14 07:54:41

标签: arrays algorithm sorting

我们正在给出一个大小为N的数组,在一步中,我可以从位置p获取一个元素,并将放在之前和之后的其他元素中。
对于Ex:

A = {3,1,2}

我拿三个并把它放在2之前,所以数组变成A={1,2,3}

我需要找到升序或降序排序和数组所需的最小步数

我的方法

找出对数组进行排序所需的最小步数的反转次数。

Sudo Code

   for i 1 to N:

        Count = Number of Element greater than A[i] from 1 to i
        if(Count>1) steps++
        Update(A[i])

  Similary from Descending

  for i N to 1:
        Count = Number of Element smaller than A[i] from i to N
        if(Count>1) steps++
        Update(A[i])

取两者的最小值,我可以使用段树来计算元素,所以整体复杂度 O(N * logN)

问题

我的方法是对的吗?因为我只将元素放在一个方向中,所以在问题中允许两个方向(之前和之后)。 它会给我正确的最小步骤吗?

1 个答案:

答案 0 :(得分:1)

它与反演无关。

让我们看一下剩下的东西(也就是从未移动过的元素)。这是一个不断增加的后续序列。我们还可以将所有其他元素放在我们想要的任何地方。因此,答案是n减去数组中最长的增加子序列的长度(对于升序)。

即使你的例子,你的方法也不起作用。如果数组为{3, 1, 2},则会打印0。正确答案是1