這裏,主要是對經典的排列組合問題進行了總結,並歸納瞭解決這些問題的方法。解決這一類問題非常重要的一點是:要會靈活變通,有些新問題貌似沒見過,但其實就是換了個馬甲。
一、優限法
即 優先法,優先考慮對位置有要求的元素,再考慮餘下的元素。
【例】
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