回溯算法之全排列问题
解法框架
【README】回溯算法基本框架
全排列問題(點擊跳轉)
首先我們需要仔細觀察函數的返回值和形參等(這里我使用的C++,因為它處理數組,字符串特別方便),這里形參是一個vector的引用,也就是一個數組,那么它肯定可以作為選擇列表,返回值則是一個二維數組,二維數組中每一個元素保存的是一個正確的返回結果
那么這里我們就對應起來了,返回是二維數組,二維數組中的每項都是一個vector,所以咋們的路徑也一定是一個vector,每次達到結束條件之后,把一個路徑作為二維數組的一項添加進去。
于是在全局定義,二維數組,在函數內部定義路徑
好的下一步就是回溯算法核心:遍歷決策樹
遍歷一個決策樹的遞歸函數backtrack,其形參分別是路徑track和選擇列表nums,
我們說過此函數內部就是做選擇,遞歸,撤銷選擇循環過程。而做選擇時候就是在遍歷選擇列表,于是我們可以寫成這樣
但是這樣對嗎,肯定是有問題的。前面我們說過,做選擇要求的是做出正確的選擇,而全排列要求數字全部不重復,所在做出選擇之前,我們要進行判斷,要是當前的選擇已經出現過了那么就直接跳過。
最后也是最為重要的,那就是一定要有結束條件,這里結束條件就是選夠三個數字之后就可以結束了,選擇夠三個數字,此時的track就可以作為ret的一項被添加進去了
好的代碼如下,這里還需要強調C++的一個問題呢,那個形參最好搞成引用,不然會引發很大拷貝,空間代價太高了
總結
以上是生活随笔為你收集整理的回溯算法之全排列问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 1 Orchard 入门篇-Orchar
- 下一篇: OllyDbg 使用笔记 (十二)