排列组合问题
基本的排列组合问题,就是高中数学的内容,怎么用编程语言输出所有排列呢?我们手写的过程,它应该是一个递归的过程,而不适合用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();
}
}
参考资料:《计算机程序的构造和解释》
日进有功

浙公网安备 33010602011771号