Java 通过从n个数组中最多选取1个元素来查找n个数组中的m个元素
我有Java 通过从n个数组中最多选取1个元素来查找n个数组中的m个元素,java,arrays,algorithm,max-flow,Java,Arrays,Algorithm,Max Flow,我有n数组,每个数组包含任意数量的整数。一个数组中不可能有重复项([1,1,2]不能是n数组之一) 我还有一个大小为m的整数数组,它由1到m的整数填充(数组项的值=数组索引+1)。示例:m=4,适当的数组是[1,2,3,4] 我的问题: 对于给定的n和m,是否可以通过从每个n数组中最多选取1个元素来查找m数组中的每个元素 例如: n=3,m=3, n数组:[1],[1,2],[2,3] 输出应为:Yes (因为我们可以通过从每个n数组中最多选取1个元素来找到m数组中的每个元素。查看n数组,从第一
n
数组,每个数组包含任意数量的整数。一个数组中不可能有重复项([1,1,2]
不能是n
数组之一)
我还有一个大小为m
的整数数组,它由1
到m
的整数填充(数组项的值=数组索引+1)。示例:m=4
,适当的数组是[1,2,3,4]
我的问题:
对于给定的n
和m
,是否可以通过从每个n
数组中最多选取1个元素来查找m
数组中的每个元素
例如:
n=3,m=3,
n
数组:[1]
,[1,2]
,[2,3]
输出应为:Yes
(因为我们可以通过从每个n
数组中最多选取1个元素来找到m
数组中的每个元素。查看n
数组,从第一个数组中选取1
,从第二个数组中选取2
,从第三个数组中选取3
。)
这是一个面试问题,我收到了一个关于最大流量问题的提示(我看不出这对我有什么帮助)。你可以这样构建一个图表:图表分为左部分和右部分。左侧部分包含表示
n
数组的n
顶点。右侧部分包含表示m
数字的m
顶点
然后我们考虑这些代码> N< /代码>数组。如果元素
k
包含在i
-th数组中,我们将在左侧的i
-th顶点和右侧的k
-th顶点之间绘制一条边。我们的目标是选择m
边,以便右侧的每个m
顶点被m
边正好覆盖一次,左侧的顶点最多覆盖一次。这是一个二部图最大匹配问题,可以用很多算法来解决,包括max-flow。我认为应该用递归方法来解决
- 如果m是空列表,则传递
- 否则,查找包含m的第一个元素的m的成员
- 如果未找到:失败
- 对于找到的每一个:
- 如果有
和m'=tail(m)
n'=n的其他成员的通行证,则m的这个成员是通行证的一部分
- 如果有
public boolean check(List<Integer> m, List<List<Integer>> n) {
if (m.isEmpty()) {
return true;
}
int head = head(m);
List<Integer> tail = tail(m);
for (List<Integer> nMember : n) {
if (nMember.contains(head) && check(tail, nMinus(n, nMember))) {
return true;
}
}
return false;
}
公共布尔检查(列表m,列表n){
if(m.isEmpty()){
返回true;
}
int水头=水头(m);
列表尾=尾(m);
对于(列表n成员:n){
if(n成员包含(头部)和检查(尾部,n分钟(n,n成员))){
返回true;
}
}
返回false;
}
假设方法:
返回传递列表的第一个元素head()
返回移除第一个元素的已传递列表tail()
返回删除了nMinus()
n成员的
n的视图或副本。它不应该修改
n
listomiting
list包装器类,用它来实现nMinus()
,而不使用番石榴
我不能肯定这不是太残酷,但它“感觉”对我的面试答案来说足够有效。can
n=[5,7][8,9][10,15]。。。m=[1,2,3,4]
发生了什么?或者是否存在不允许n和m阵列如此不同的条件?最大流算法与图有关,因此n-数组可能是一个节点。你只能从那里选择一条边到达目的地。那么问题的编码方面呢?也许你写了一些代码来帮助你摆脱困境???@hamena314这样的n
数组是可能的。@ShayHaned当我甚至不能在纸上给出问题的一般解决方案时,编写代码是很困难的。有趣的方法,在纸上有效,我将尝试实现它。添加了一张图片-如果我弄错了,请告诉我。请注意,这需要指数时间,尽管这是一个有效的解决方案。添加对该方法的高级解释可能是个好主意。这种方法效率太低。