美文网首页
N个集合,每个集合选一个元素组成新集合,打印所有结果

N个集合,每个集合选一个元素组成新集合,打印所有结果

作者: 雁阵惊寒_zhn | 来源:发表于2020-11-11 11:24 被阅读0次

题目

给定n个集合,每个集合选一个元素组成新集合,打印所有结果。
例如,给定3个集合<1,2>,<3>,<4,5>,可所有结果为<1,3,4>,<1,3,5>,<2,3,4>,<2,3,5>

解析

从第一个集合的元素开始,依次选择第二个集合中的元素,直到最后一个集合,所有的元素构造了一个有向图无环结构。例子中集合构造的有向图如下图。从入度为0的节点出发,对有向无环图进行深度遍历,所有存在的路径就是需要打印的所有结果。

例子中集合构造的有向无环图

这里图的深度遍历,也可以理解为类似树的层级遍历,多叉树的层级遍历和多叉树所有路径。用递归回溯方法实现,入度为0的节点开始,向下一个层级深度遍历,每一个层级,节点遍历后回溯,然后继续遍历当前层级的下一个结点。如果是最后一个层级的节点,记录结果,遍历超过最后的层级,递归方法结束。

代码

//记录所有组合的结果
private List<List<Integer>> result = new LinkedList<>();
//回溯时暂存当前一个集合
private LinkedList<Integer> list = new LinkedList<>();
//递归回溯
public void printAllSets(List<List<Integer>> input, int row){
    //遍历超过最后的层级,递归方法结束
    if (row >= input.size()){
        return;
    }
    //当前row的层级
    List<Integer> in = input.get(row);
    //遍历当前层级的所有结点
    for (Integer i : in){
        list.add(i);//暂存当前节点
        //如果是最后一层,保存结果
        if (input.size() == row + 1){
            result.add(new LinkedList<>(list));
        }
        //从当前节点出发,递归遍历下一层级
        printAllSets(input,row + 1);
        //当前节点遍历结束后,进行回溯,然后准备遍历下一个节点
        list.removeLast();
    }
}

相关文章

网友评论

      本文标题:N个集合,每个集合选一个元素组成新集合,打印所有结果

      本文链接:https://www.haomeiwen.com/subject/qrtnmktx.html