这里,主要是对经典的排列组合问题进行了总结,并归纳了解决这些问题的方法。解决这一类问题非常重要的一点是:要会灵活变通,有些新问题貌似没见过,但其实就是换了个马甲。
一、优限法
即 优先法,优先考虑对位置有要求的元素,再考虑余下的元素。
【例】
A、B、C、D、E五个人排队,要求A必须站在队首或队尾,问多少种排列方式?
思路:
先安排A,有种情况,剩下的4个元素有中排列方式,由分步原理,共有
种情况。
二、捆绑法
捆绑法就是把要求相邻的元素放在一起,当成一个大元素考虑,相当于在原来的基础上消灭了相邻的元素,新加了一个元素,同时注意:大元素内部可能也要考虑顺序,考题目要求。
【例】
A、B、C、D、E五个人排队,要求A和E必须相邻,问有多少种排列方式?
思路:
A和E相邻,我们可以把A和E捆绑在一起,当成一个元素,注意:A和E是不同的个体,也有顺序之分,有种情况,然后对新的组成进行排列,有中情况,由分步原理,共有,
种情况。
三、插空法
这种情况和第二种正好相反,要求某几个元素不能相邻。我们可以先把其余的元素进行排列组合,然后再把不能相邻的元素插到排列好的元素之间的空隙之中。
【例】
A、B、C、D、E五个人排队,要求A和B不能站在一起,问有多少种排列方式?
思路:
先对没有要求的元素进行排队,有种情况,排列好的元素之间形成了种情况,所以,共有,
种情况。
四、间接法
其实就是在找互斥(对立)事件,原问题看起来可能很复杂,要讨论的情况很多。但是其互斥事件相对简单简单一些。然后用总的可能情况减去互斥的情况。
【例】
A、B、C、D、E五个人排队,要求A和B必须有一个排在前两排的位置,问有多少种排列方式?
思路:
如果按照题目要求直接来做的话,需要讨论A排在前两排,或B排在前两排,或A和B同时排在前两排三种情况,比较繁琐。这里我们可以考虑其对立事件,即A和B都没有排在前两排的情况。那么,我们可以先对没有约束的元素进行排序,有种情况,然后对A排序,有种组合,对B排序,有种组合。不考虑约束,共有种组合,所以,满足条件的排列有,
种情况。
五、实战
拿了一个网易的面试题练练手,看看大部分的题不是那么中规中矩的
【例】
从数字集合{1,2,3,4,… ,20}中选出4个数字的子集,如果不允许两个相连的数字出现在同一集合中,那么能够形成多少个这种子集?
思路:
看起来好像和前面的方法没有关联,其实是有的。从20个数字中挑选出4个不相邻的数字,其实和这个问题是一样的:“将4本书添加到16本书里,有多少种添加方式?”,16本书,共产生17个间隙,选择4个间隙,共有
种情况。
不是是因为集合内的元素没有先后顺序。
参考资料:
1.网易数据分析面试题:
https://www.nowcoder.com/questionTerminal/dd21a5b395a143ea8d732bfc98ba41bc