用Backtracking思想解決subset/permutation/combination/partition問題

這兩天專門訓練了backtracking類型的問題,包括N皇后、全排列全組合等等,我到如今也沒法徹底清晰描述recursive裏的運行過程,可是多作了幾道這種類型的題目以後發現仍是頗有套路的,即便思路不是很清晰也能夠「湊」出代碼。

recursive的代碼有兩點關鍵:1.出口條件 2.循環的寫法數組

  1. 出口條件:出口條件仍是挺容易,如全排列中list的長度爲nums的length就把它加入到result list中,好比combination中sum等於target
  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;
相關文章
相關標籤/搜索