排列组合问题

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

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

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

  递归方法实现排列问题:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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 @   懂得了才能做一些改变  阅读(124)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
点击右上角即可分享
微信分享提示