|
|
1
28
正如@IVlad在对你的问题的评论中指出的那样 Yodaness problem 让你数数 number of inversions 而不是最小数量的交换。 例如:
交换的最小数目是
一
(交换5和3英寸
计算倒数的最简单方法如下 the definition :
在Python中:
输出:
|
|
|
2
13
正如Sebastian的解决方案所暗示的,您正在寻找的算法可以基于检查 permutation's cycles .
每个排列都可以表示为一组不相交的循环,表示项的循环位置变化。例如置换P有2个循环:(2,1)和(4,3)。因此,两次互换就足够了。在一般情况下,只需从置换长度中减去循环数,即可得到所需交换的最小数目。这是根据观察得出的,为了“固定”一个由N个元素组成的循环,N-1次交换就足够了。 |
|
|
3
3
这个问题有一个干净、贪婪、琐碎的解决方案:
|
|
|
4
0
这可以很容易地转换成另一种类型的问题,可以更有效地解决。所需要的只是将数组转换为置换,即将值更改为它们的id。因此,您的阵列:
会变成
将排列从一个转换到另一个可以转换为类似的问题( Number of swaps in a permutation )通过将O(n)中的目标置换求逆,将O(n)中的置换合成,然后求出从那里到O(m)中的恒等置换的交换数。
为了计算步数,可以设计一个简单的算法,例如:
而且很重要
一次交换。现在,假设它返回的交换数确实是最小的,那么算法的运行时就受到它的限制,并且保证完成(而不是陷入无限循环)。它会跑进来的
该算法只适用于有效的置换,对于具有重复值的序列将无限循环,对于具有非重复值的序列将执行越界数组访问(和崩溃)
|
|
|
5
0
算法:
代码:
|
|
|
6
0
因为我们已经知道arr2具有arr1中每个元素的正确索引。因此,我们可以简单地比较arr1元素和arr2元素,并用正确的索引替换它们,以防它们位于错误的索引。
|
|
|
7
-1
@J.F.塞巴斯蒂安和@Eyal Schneider的回答很酷。
我在解决一个类似的问题时受到启发:
计算排序数组所需的最小交换
,例如:排序
|
|
|
8
-2
这看起来像是一个 edit distance 问题,除了只允许换位。 DamerauâLevenshtein distance 伪代码。我相信你可以把它调整到只数换位。 |
|
|
feasega · 聚合物模拟-2个节点之间的最短路线,适用于所有节点 1 年前 |
|
|
Alisa Petrova · 在有向图中更改一对顶点以创建循环 1 年前 |
|
|
b39b332d · 使用C++标准库实现高效间隔存储 2 年前 |
|
ABGR · 二叉树的直径——当最长路径不通过根时的失败案例 2 年前 |
|
|
EpicAshman · 数独棋盘程序中同一列和同一行出现两次的数字 2 年前 |