排列组合问题

  基本的排列组合问题,就是高中数学的内容,怎么用编程语言输出所有排列呢?我们手写的过程,它应该是一个递归的过程,而不适合用for/wihle循环。如果数据结构学的扎实,可以发现这是一个树结构,遍历所有的叶子节点就能够得到全排列。说到递归,应该向大家隆重介绍一下数学归纳法的思想,应为都有一个问题规模n。然后树可以演变成图,然后就对深度优先遍历,还是广度优先遍历算法的各个形式要很熟悉。

  有一个金典的问题是找零钱问题统计。

  其实这种类似问题,往深了挖,本质就是图的问题,改天附上图片,并说明一些问题.

  递归方法实现排列问题:

public void permutation(List<List<Integer>> res,Stack<Integer> path,List<Integer> remaining,int k){
       // 无路可走或者到达最大层次
        if(remaining.size()==0 || k<=0){
                List<Integer> ls = new ArrayList(path);
                res.add(ls);
                return;
        }
        for(int i=0;i<remaining.size();i++){
                Integer ele = remaining.get(i);
                path.push(ele);
                List<Integer> remaining2 = new ArrayList(remaining);
                // 可以选的点
                remaining.remove(i);
                // 递归调用
                permutation(res,path,remaining2,k-1);
                path.pop();
        }
    }

  

 

 参考资料:《计算机程序的构造和解释》

posted @ 2020-02-01 15:47  懂得了才能做一些改变  阅读(134)  评论(0)    收藏  举报