【问题标题】:Sort a set of disks in minimum number of moves以最少的移动次数对一组磁盘进行排序
【发布时间】:2017-05-07 19:11:23
【问题描述】:

所以这个问题更像是一个算法/方法寻求问题,我正在寻找关于如何解决这个问题的任何想法/见解。我正在浏览一组编程问题,遇到了一个问题,我需要提供对项目列表进行排序所需的最少移动次数。虽然这个问题被标记为“简单”,但我找不到一个好的解决方案。欢迎您的想法。 问题陈述是这样的。

X 有 N 个等半径的圆盘。每个磁盘都有一个从 1 到 N 的不同数字与之关联。磁盘以随机顺序一个叠放在一堆中。 X 想按从上到下的递增顺序对这堆磁盘进行排序。但他有一个非常特殊的方法来做到这一点。 一步他只能从一堆磁盘中选择一个,他只能把它放在最上面。 X 想以最少的可能步骤对他的一堆磁盘进行排序。你能找到对这堆随机排序的磁盘进行排序所需的最少移动次数吗?

【问题讨论】:

  • 看起来有一个贪心算法对堆进行排序。它最多选择每个磁盘一次。在每个步骤中选择...的磁盘并将其移至顶部。自己找出替换三个点的情况很有趣,所以我不会放弃它。

标签: arrays algorithm sorting


【解决方案1】:

在不考虑采取最小动作的情况下解决它的简单方法是: 取一个最大值的磁盘并将其放在顶部。然后取第二个最大值并将其放在顶部。依此类推,直到全部排序。现在这种贪婪的方法并不总是给你最小的步骤。

考虑这个例子:[5,4,1,2,3] 使用上面的贪心方法,它会是这样的:

[5,4,1,2,3] 
[4,1,2,3,5]
[1,2,3,5,4]
[1,2,5,4,3]
[1,5,4,3,2]
[5,4,3,2,1]

这需要 5 步,但最少步数应该是这样的:

[5,4,1,2,3]
[5,4,1,3,2]
[5,4,3,2,1]

只需要2个

要获得最小移动,首先考虑有多少值已经从 N 开始按降序排列,你可以考虑那些你不需要移动的东西。其余的你必须移动这是最小值。例如

[1,5,2,3,10,4,9,6,8,7]

这里从 10 开始,共有 4 个数字按 [10,9,8,7] 的顺序排列,其余的则需要移动。所以最小移动将是 10-4 = 6

[1,5,2,3,10,4,9,6,8,7]
[1,5,2,3,10,4,9,8,7,6]
[1,2,3,10,4,9,8,7,6,5]
[1,2,3,10,9,8,7,6,5,4]
[1,2,10,9,8,7,6,5,4,3]
[1,10,9,8,7,6,5,4,3,2]
[10,9,8,7,6,5,4,3,2,1]

【讨论】:

  • 我想我可以使用这种方法来解决问题。 :) 完成后我会发布结果。谢谢!
猜你喜欢
  • 2017-01-04
  • 1970-01-01
  • 2016-08-05
  • 2019-08-08
  • 1970-01-01
  • 2012-12-07
  • 2017-01-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多