我们正在给出一个大小为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)
问题
我的方法是对的吗?因为我只将元素放在一个方向中,所以在问题中允许两个方向(之前和之后)。 它会给我正确的最小步骤吗?
答案 0 :(得分:1)
它与反演无关。
让我们看一下剩下的东西(也就是从未移动过的元素)。这是一个不断增加的后续序列。我们还可以将所有其他元素放在我们想要的任何地方。因此,答案是n
减去数组中最长的增加子序列的长度(对于升序)。
即使你的例子,你的方法也不起作用。如果数组为{3, 1, 2}
,则会打印0
。正确答案是1
。