我们有n张卡片,每张卡片编号从1到n。所有卡片都是随机洗牌的。我们只允许执行MoveCard(n)操作,它将编号为n的卡片移动到牌堆顶部。我们需要用最少的MoveCard操作对牌堆进行排序。我能想到的朴素方法是从MoveCard(n),MoveCard(n-1),MoveCard(n-2).... MoveCard(1)开始。这种方法将在n次MoveCard操作中解决问题。但是我们能不能进行优化呢?例如,如果输入是:3 1 4 2,按照我的方法:
4 3 1 2
3 4 1 2
2 3 4 1
1 2 3 4
MoveCard操作是4次。
但我们可以用最少的移动次数来解决这个问题:
优化后的解决方案是:
3 1 4 2
2 3 1 4
1 2 3 4
MoveCard操作次数为2。
从上面优化的解决方案中,我认为以下方法可以解决问题。
我们总是选择要移动的元素,该元素将排序后的元素置于顶部和底部,并满足排序子数组从开头到最大元素应小于从底部到最小元素的排序子数组。
在这种情况下:
3 1 4 2
将2移到第二个位置,得到2 3 1 4 {其中2和3从最开始就已经排好序,而4是从底部排好序的}
现在我们选择1,就可以得到完全排序过的数组。1 2 3 4。