【回溯法】some全排列➕組合總和➕括號生成中,摸爬滾打出的回溯法小結

0 初步理解

“回溯”算法也叫“回溯搜索”算法,主要用於在一個龐大的空間裏搜索我們所需要的問題的解。
我們每天使用的“搜索引擎”就是幫助我們在龐大的互聯網上搜索我們需要的信息。“搜索”引擎的“搜索”和“回溯搜索”算法的“搜索”意思是一樣的。

“回溯”指的是“狀態重置”,可以理解爲“回到過去”、“恢復現場”,是在編碼的過程中,是爲了節約空間而使用的一種技巧。
而回溯其實是“深度優先遍歷”特有的一種現象。
之所以是“深度優先遍歷”,是因爲我們要解決的問題通常是在一棵樹上完成的,在這棵樹上搜索需要的答案,一般使用深度優先遍歷。

我理解的就是,你需要倒回去一步才能解決問題的題目

1、爲什麼使用深度優先遍歷?

(1)首先是正確性,只有遍歷狀態空間,才能得到所有符合條件的解;

(2)在深度優先遍歷的時候,不同狀態之間的切換很容易,可以再看一下上面有很多箭頭的那張圖,每兩個狀態之間的差別只有 1 處,因此回退非常方便,這樣全局才能使用一份狀態變量完成搜索;

(3)如果使用廣度優先遍歷,從淺層轉到深層,狀態的變化就很大,此時我們不得不在每一個狀態都新建變量去保存它,從性能來說是不划算的;

(4)如果使用廣度優先遍歷就得使用隊列,然後編寫結點類。使用深度優先遍歷,我們是直接使用了系統棧,系統棧幫助我們保存了每一個結點的狀態信息。於是我們不用編寫結點類,不必手動編寫棧完成深度優先遍歷。大家可以嘗試使用廣度優先遍歷實現一下,就能體會到這一點。

作者:liweiwei1419
鏈接:https://leetcode-cn.com/problems/permutations/solution/hui-su-suan-fa-python-dai-ma-java-dai-ma-by-liweiw/
來源:力扣(LeetCode)
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。

在這裏插入圖片描述

1 解題套路

自己的理解的套路,僅供自己以後看哈哈哈哈

首先就是你需要寫一個新的dfs函數,返回值類型爲空的那種

  • 第一步,在這個函數裏面,最難的也就是確定函數的傳參數方面,
    這個嗎,可以留着最後寫的哦
    一般的套路可能是,數組長度len, 索引值i, 目標值target,路徑path,結果集res

在這個裏面呢,前三個都是int類型,好理解的哦
路徑path是List類型,新建的時候語句是List<Integer> path = new ArrayList<>();這個path呢,需要增加新的需要加入的節點,還需要刪掉上一個節點實現狀態重置,
這個類型,加入節點用的是add方法,如path.add(nums[i]); 刪除節點用的是remove方法,如path.remove(path.size() - 1);
但是呢官方建議用 Deque類型, 新建的時候語句是 Deque<Integer> path = new ArrayDeque<>(len); 不過我還是覺得上面的簡單
這個類型,加入節點用的是addLast方法,如path.addLast(candidates[i]); 刪除節點用的是removeLast方法,如path.removeLast();

結果集res是List<List> res = new ArrayList<>();

  • 第二步是確定到達葉子節點的成功條件
    比如說,
////已經找到滿足長度的數組,可以進行返回
if(depth == len){
     //這個地方要進行數據的複製,否則返回的是空
     res.add(new ArrayList<>(path));
     return;
  • 第三步是接下來就進入循環體內,從索引到最後,開始循環,
    判斷剪枝條件,進行有效剪枝
    剪枝完成之後,
    沒有被用過加入到path路徑之中
    然後進行遞歸dfs操作,注意這個時候的深度是要+1的
    最後要將上次加入的那個值刪除掉

題目原有的函數

先來初始化len和結果集res
第一步是進行特判如果len爲0,返回空的res

這個時候如果需要去重的話,就要在這裏先進行排序

第二步是新建初始化path
如List path = new ArrayList<>(); 或者 Deque path = new ArrayDeque<>(len);

第三步是遞歸操作

第四步返回結果集res

大功告成~~~~

2 有關題目

LeetCode 46➕47
題解博客地址:[ 熱題 HOT 100—46. 全排列➕47. 全排列 II— 回溯法/dfs

LeetCode 39 ➕40
題解博客地址:[ 熱題 HOT 100—39. 組合總和➕40. 組合總和 II – 回溯法+剪枝

LeetCode 22

題解博客地址:[ 熱題 HOT 100–22. 括號生成-- 回溯算法/深度優先遍歷

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章