這兩天專門訓練了backtracking類型的問題,包括N皇后、全排列全組合等等,我到如今也沒法徹底清晰描述recursive裏的運行過程,可是多作了幾道這種類型的題目以後發現仍是頗有套路的,即便思路不是很清晰也能夠「湊」出代碼。
recursive的代碼有兩點關鍵:1.出口條件 2.循環的寫法數組
循環的寫法:
1.全組合中爲了不重複組合的出現,每次取值都從下一個i開始code
for (int i = index; i < mums.length; i ++)
全排列中每次都從首位開始取值,可是已經取過的元素不能再取get
for (int i = 0; i < mums.length; i ++)
同時用一個visited數組來記錄元素是否被訪問過it
if (visited[I] == true) continue;
2.如何處理有重複的狀況?首先均需通過sort的預處理
全組合去除重複組合的寫法:io
if (i > index && nums[i] == nums[i-1]) continue;
全排列去除重複組合的方法:循環
if (i > 0 && nums[i] == nums[i-1] && visited[i-1] == false) continue;