组合排列遍历算法浅析(一)

简介:    最近一段时间,稍微空闲了些,于是准备把去年面试某公司时遇到的题写出来。    回味那次面试,真是有点尴尬,大学毕业后,一直忙于这样技术、那样技术,此控件、彼控件的,对于基础的东西忘得差不多了。

   最近一段时间,稍微空闲了些,于是准备把去年面试某公司时遇到的题写出来。

   回味那次面试,真是有点尴尬,大学毕业后,一直忙于这样技术、那样技术,此控件、彼控件的,对于基础的东西忘得差不多了。

于是乎,在面试官一道问题下,顿显尴尬。不过这个面试官的面试方法我觉得挺变态的……

   通过了第一轮电面,第二轮笔试,开始了第三轮面试的时候,面试官开始问一些工作经历上的事情。问得差不多的时候,突然来一句,

这里有一道比较简单的算法题,你来解一下喃:

   有n个数,打印出取其中m个数的所有组合。

   我当时脑中只记得了C(n,m)这么个符号了,于时我开始努力回忆相关知识……然后面试官就坐我对面,看着我。他越看我越紧张……15分钟后,

我当时先给出了一种算法出来,也不知道对不对,完全没有把握,因为相关知识始终没有回忆起来。然后面试官居看了后,也没有说对或错。只是又来一句,

那我们换另外个简单问题:

   有n个数,打印出取其中m个数的所有排列。

   这次真尴尬了,过了25分钟了,我还没有给出算法,面试官就一直在那儿看着我。后来无奈下放弃了。

 

   回家后,我心里相当不舒服。开始重新推敲相关的公式。首先,我勉强能记着:

           组合公式C(n,m)=n!/((n-m)!m!),

           然后是排列公式A(n,m)=n!/(n-m)!

         这下没有人一直看着我,我的脑袋终于开始灵光了。在算法设计上,我准备采用递归的思路,然后很快想出解决思路:

   1)对于组合,首先我想推敲出C(n,m)与C(n-1,m-1)之间的关系。通过举例的方法,我判断出大概有C(n,m)=C(n-1,m-1)+C(n-1,m)的关系。

然后我开始通过数学来验证:C(n-1,m-1)+C(n-1,m)=(n-1)! / ( (n-m)!(m-1)!) + (n-1)! / ((n-m+1)!m!) 

 通分过后=m(n-1)! / ( (n-m)!m!)    +   (n-m)(n-1)! / ((n-m)!m!)=n! / ( (n-m)! m!)=C(n,m)=C(n,m)

            OK,这样就可以开始编码了。

 

   2)对于排列,我也准备推敲出A(n,m)与A(n-1,m-1)的关系。这个推敲很简单。A(n,m)=n*A(n-1,m-1),推导过程我就不写了。

   于是,这里也可以编码了。

 

   当时只推出了公式,没有实现编码。等这几天空的时候,我就再把代码补上。对于这里的算法,我在想出递归的方法后,就没有继续去想

动态规划的算法了。如果哪位有更高级的算法,不妨拿出来交流下。感激不尽!

 

 

相关文章
|
3月前
|
存储 算法 Java
Java中,树与图的算法涉及二叉树的前序、中序、后序遍历以及DFS和BFS搜索。
【6月更文挑战第21天】Java中,树与图的算法涉及二叉树的前序、中序、后序遍历以及DFS和BFS搜索。二叉树遍历通过访问根、左、右子节点实现。DFS采用递归遍历图的节点,而BFS利用队列按层次访问。以下是简化的代码片段:[Java代码略]
36 4
|
1月前
|
存储 算法 Java
LeetCode经典算法题:二叉树遍历(递归遍历+迭代遍历+层序遍历)以及线索二叉树java详解
LeetCode经典算法题:二叉树遍历(递归遍历+迭代遍历+层序遍历)以及线索二叉树java详解
55 0
|
1月前
|
算法 Java
LeetCode初级算法题:环形链表+排列硬币+合并两个有序数组java解法
LeetCode初级算法题:环形链表+排列硬币+合并两个有序数组java解法
40 0
|
2月前
|
存储 算法 Python
“解锁Python高级数据结构新姿势:图的表示与遍历,让你的算法思维跃升新高度
【7月更文挑战第13天】Python中的图数据结构用于表示复杂关系,通过节点和边连接。常见的表示方法是邻接矩阵(适合稠密图)和邻接表(适合稀疏图)。图遍历包括DFS(深度优先搜索)和BFS(广度优先搜索):DFS深入探索分支,BFS逐层访问邻居。掌握这些技巧对优化算法和解决实际问题至关重要。**
25 1
|
2月前
|
算法 JavaScript
JS 【详解】树的遍历(含深度优先遍历和广度优先遍历的算法实现)
JS 【详解】树的遍历(含深度优先遍历和广度优先遍历的算法实现)
43 0
JS 【详解】树的遍历(含深度优先遍历和广度优先遍历的算法实现)
|
2月前
|
存储 算法 搜索推荐
|
3月前
|
算法 Java 索引
【算法】重建二叉树并进行后序遍历的Java实现
【算法】重建二叉树并进行后序遍历的Java实现
30 5
|
3月前
|
存储 算法 Java
广度优先搜索(Breadth-First Search,BFS)是一种用于图的遍历或搜索的算法。
广度优先搜索(Breadth-First Search,BFS)是一种用于图的遍历或搜索的算法。
|
2月前
|
算法 JavaScript
JS 【详解】二叉树(含二叉树的前、中、后序遍历技巧和算法实现)
JS 【详解】二叉树(含二叉树的前、中、后序遍历技巧和算法实现)
32 0
|
3月前
|
算法 搜索推荐 C++
C++之STL常用算法(遍历、查找、排序、拷贝、替换、算数生成、集合)
C++之STL常用算法(遍历、查找、排序、拷贝、替换、算数生成、集合)