Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 通过从n个数组中最多选取1个元素来查找n个数组中的m个元素_Java_Arrays_Algorithm_Max Flow - Fatal编程技术网

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当我甚至不能在纸上给出问题的一般解决方案时,编写代码是很困难的。有趣的方法,在纸上有效,我将尝试实现它。添加了一张图片-如果我弄错了,请告诉我。请注意,这需要指数时间,尽管这是一个有效的解决方案。添加对该方法的高级解释可能是个好主意。这种方法效率太低。