Algorithm 使用给定的操作对数组进行排序

Algorithm 使用给定的操作对数组进行排序,algorithm,dynamic-programming,Algorithm,Dynamic Programming,给出了一个标记为1到M的M个数的列表。我们也给出了类型为X-Y的Q运算 每个操作意味着我们可以简单地将值为X的数字更改为值为Y的数字,反之亦然。这些操作也是可传递的。这意味着如果X->Y和Y->Z,那么X也可以更改为Z 现在我们得到了一个N个数字的序列,我们需要通过修改最小数字的数量,使其按递增顺序排序(可能不是严格递增)。如果不可能,则返回-1以告知其不可能 示例:假设我们有3个数字(=M)和3个运算(=Q),如下所示: 1 2 2 3 1 3 让N=3,数组修改为[3,2,1],那么答案是

给出了一个标记为1到M的M个数的列表。我们也给出了类型为X-Y的Q运算

每个操作意味着我们可以简单地将值为X的数字更改为值为Y的数字,反之亦然。这些操作也是可传递的。这意味着如果X->Y和Y->Z,那么X也可以更改为Z

现在我们得到了一个N个数字的序列,我们需要通过修改最小数字的数量,使其按递增顺序排序(可能不是严格递增)。如果不可能,则返回-1以告知其不可能

示例:假设我们有3个数字(=M)和3个运算(=Q),如下所示:

1 2
2 3
1 3
让N=3,数组修改为[3,2,1],那么答案是2(因为我们在数组中修改了2个数字),因为可以将第一个数字转换为1,最后一个数字转换为2。得到的数组是[1,2,2],它正在增加

但是让M=3,我们只有一个运算:23。另外,如果N=2,数组为[2,1],则无法对其进行排序,因为它只能转换为[2,1]或[3,1]

那么如何解决这个问题呢?请帮忙


假设M的最大值为200,那么我们可以从特定的数字中找到可以达到的数字。但我无法解决这个问题,因为N可以达到200000。因此,如何维护数组是否已排序。我认为DP可以提供帮助,但还没有线索。

这是一个用于创建算法的解释

首先,将给定X的所有y集合到一个映射中。然后为给定的Y组装所有的x。这样,您将得到数据结构
Map
作为
Map
。例如,如果Q是

1  2
2  3
1  3
4  3
然后,对于X=1,将有一个映射条目作为
。因此,完整的映射将是

<1,{2,3}>
<2,{1,3}>
<4,{3}>
<3,{1,2,4}>

请注意,由于Q是一组可交换的操作,我们不需要为2设置两个键,尽管其中两个键同时显示为X和Y。因此,我希望您能够遵循到目前为止的操作,因为整个算法都基于此映射。然后是算法

包算法;
导入java.util.array;
导入java.util.HashMap;
导入java.util.HashSet;
导入java.util.Map;
导入java.util.Set;
公营索塔雷酒店{
/**
*给定一个数组和一组可交换和可传递的交换,按
*递增顺序。返回排序数组所需的操作数。
* 
*@param输入
*@param操作
*@返回
*/
静态int-sortArray(int[]输入,int[]操作){
int-ops=0;
地图地图=平坦化操作(操作);
int min=小元素(操作);
for(int i=0;i=min){
返回el;
}
}
}
返回-1;
}
静态私有布尔isSortedAscending(int[]输入){
for(int i=1;i