dfs,深度優(yōu)先搜索,應(yīng)該算是算法之路上的一堵墻,雖然沒有動(dòng)態(tài)規(guī)劃的上限高,但是入門的難度仍然不低??薲fs好幾周,終于悟到了一點(diǎn)點(diǎn),
以最簡單的全排列問題入手,給定一個(gè)數(shù)字n,按照字典順序輸出自然數(shù)1到n所有不重復(fù)的排列,任何一個(gè)數(shù)字序列中不出現(xiàn)重復(fù)的數(shù)字,這就是全排列。
在csdn上搜了搜,全排列主流有兩種辦法,一種是通過定義兩個(gè)指針start、end控制范圍,通過交換數(shù)組中的值,不斷遞歸實(shí)現(xiàn)全排列,但是使用這種方法,實(shí)現(xiàn)的全排列并不是按字典順序排列的,因此最好用的就是用遞歸加回溯去實(shí)現(xiàn)。
遞歸回溯法需要定義一個(gè)boolean數(shù)組和一個(gè)int型數(shù)組,boolean數(shù)組用于判斷數(shù)字是否被使用過,int數(shù)組用于存放全排列組合。遞歸回溯的核心就是把for循環(huán)和遞歸用到一起,這一點(diǎn)卡了我挺長時(shí)間,但是現(xiàn)在悟到的一點(diǎn)是,可以自己代入一個(gè)數(shù)字把整個(gè)遞歸回溯的過程寫下來,在能完整的寫出來一次后,就會(huì)發(fā)現(xiàn)其實(shí)就是for循環(huán)嵌套著for循環(huán),一步一步的,從1開始去實(shí)現(xiàn)每一種全排列組合。
dfs水很深,現(xiàn)在只是悟到了一點(diǎn)點(diǎn),記錄一下自己的思路。