Algorithm 应用变换使数组排序
我们得到M个数字,每个数字都有一个与之相关的值列表。我们可以使用列表中的任何数字来更改它(它也将仅在1到M之间) 因此,我们有(其最大尺寸为200 X 200): 现在若N=4,数组是[2,1,3,4],那个么答案是2,因为我们可以改变2->1和1->2Algorithm 应用变换使数组排序,algorithm,dynamic-programming,Algorithm,Dynamic Programming,我们得到M个数字,每个数字都有一个与之相关的值列表。我们可以使用列表中的任何数字来更改它(它也将仅在1到M之间) 因此,我们有(其最大尺寸为200 X 200): 现在若N=4,数组是[2,1,3,4],那个么答案是2,因为我们可以改变2->1和1->2 但如果变换相同,N=4且数组为[3,4,1,2],则答案为-1,因为我们无法对其进行排序。可以使用动态规划通过以下下一个递归公式进行求解: i是一个索引 x是可以填充每个索引的集合中的值(可以轻松转换为基于这些值的索引) 对于其他数组,需
但如果变换相同,N=4且数组为[3,4,1,2],则答案为-1,因为我们无法对其进行排序。可以使用动态规划通过以下下一个递归公式进行求解:
是一个索引i
是可以填充每个索引的集合中的值(可以轻松转换为基于这些值的索引)x
对于其他数组,需要相应地修改
orig
和vals
,例如[3,4,1,2]
:
orig = [3,4,1,2]
vals = [[3,4],[3,4],[1,2],[1,2]]
在这里,
max\u int32
表示这是无法完成的-您可以轻松地将其切换到-1
您能用一些例子来解释一下吗?我无法获得python,否则c++/java中的代码将非常有用。您是否使用基于1的索引?@Mrinal python相当简单,几乎类似于伪代码。试着把它想象成伪代码,你就会明白了。请注意:range(x)
生成所有值[0,1,…,x-1],
i in x`是每个循环,len(x)
是数组x的长度(java的x.length
)和什么D=[[1,1]]?如果没有错的话,我猜这的复杂性是O(NMM)?
1->{1,2}
2->{1,2}
3->{3,4}
4->{3,4}
D(0)(x) = 1 | x is not the original value //1 value array is sorted
D(0)(x) = 0 | x is the original value
D(i)(x) = min{D(i-1)(y) +1 | y < x} U { D(i-1)(y) | y<x, y is original value} U {INFINITY}
orig = [2,1,3,4]
vals = [[1,2],[1,2],[3,4],[3,4]]
D = [[1,1]]
for x in range(len(vals[0])):
if vals[0][x] == orig[0]:
D[0][x] = 0
else:
vals[0][x] = 1
for i in range(1,len(orig)):
D.append([max_int32, max_int32])
print D
for i in range(1,len(orig)):
for x in range(len(vals[i])):
for y in range(len(vals[i-1])):
if vals[i-1][y] < vals[i][x] and vals[i][x] != orig[i]:
D[i][x] = min(D[i][x],D[i-1][y] + 1)
elif vals[i-1][y] < vals[i][x]:
D[i][x] = min(D[i][x],D[i-1][y])
print min(D[len(orig)-1])
orig = [3,4,1,2]
vals = [[3,4],[3,4],[1,2],[1,2]]