Leetcode - 回溯法

  1. 回溯法代碼模版

    function zuhe(){
      let res = []
      let path = []
      
      // 回溯函數(shù)
      function backtrack(path, candidate){
        // 可以加入結(jié)果集了
        if (path.length === len){
          res.push(path.slice())      // path.slice()拷貝一份加入結(jié)果集,不影響繼續(xù)遞歸的數(shù)組
          return
        }
        // 遍歷選擇
        for(let i=0; i<nums.length; i++){
          path.push(nums[i])   // 做選擇,有時(shí)候前面要加一些跳過性語句
          backtrack(path, candidate)
          path.pop()    // 撤銷選擇  
        } 
      }
      
      backtrack(...)
      return res
    }
    
  1. 回溯思考過程

    解決一個(gè)回溯問題,實(shí)際上就是一個(gè)決策樹的遍歷過程。你只需要思考 3 個(gè)問題:

    • 路徑:也就是已經(jīng)做出的選擇。
    • 選擇列表:也就是你當(dāng)前可以做的選擇。
    • 結(jié)束條件:也就是到達(dá)決策樹底層,無法再做選擇的條件。
  1. 回溯注意點(diǎn)

    • 如何去重結(jié)果集

      if(i>start && candidates[i] === candidates[i-1]) continue  // 做選擇之前判斷是否需跳過
      
    • 候選元素不可重復(fù)使用

      for(let i=start; i<candidates.length; i++){
        // 這一行還不是很明白
        if(i>start && candidates[i] === candidates[i-1])continue
        if(candidates[i]>target) continue
        path.push(candidates[i])
        backtrack(target-candidates[i], path, i+1)
        path.pop()
      }
      
    • 候選元素可多次使用

      for(var i=start;i<candidates.length;i++){
        ...
        backtrack(target-candidates[i],i,path)   
        ...
      }
      
    • 何時(shí)可以加入結(jié)果集

      • target === 0
      • 當(dāng)前路徑長度 === 目標(biāo)長度
      • 當(dāng)前索引 === 遍歷序列最后一個(gè)元素
      • 候選列表為空

      何時(shí)加入結(jié)果集主要看你時(shí)如何界定一個(gè)滿足題意的path

  1. Leetcode相關(guān)題目

    1. 039-組合總和
    2. 040-組合總和2
    3. 077-組合
    4. 046-全排列
    5. 047-全排列2
    6. 078-子集
    7. 090-子集2
    8. 017-電話號(hào)碼的字母組合
    9. 022-括號(hào)生成
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • mean to add the formatted="false" attribute?.[ 46% 47325/...
    ProZoom閱讀 3,226評(píng)論 0 3
  • 回溯算法 回溯法:也稱為試探法,它并不考慮問題規(guī)模的大小,而是從問題的最明顯的最小規(guī)模開始逐步求解出可能的答案,并...
    fredal閱讀 14,027評(píng)論 0 89
  • "use strict";function _classCallCheck(e,t){if(!(e instanc...
    久些閱讀 2,156評(píng)論 0 2
  • 春困秋乏夏打盹,現(xiàn)在正是會(huì)經(jīng)常打盹兒的時(shí)候,為了換換腦子振奮一下精神,默默打開了leetcode練練腦子。 一道組...
    snow_in閱讀 294評(píng)論 0 2
  • GX2501閱讀 99評(píng)論 0 0

友情鏈接更多精彩內(nèi)容