(十五)算法设计思想之“回溯算法”
算法設計思想之“回溯算法”
- 回溯算法是什么?
- 什么問題適合用回溯算法解決?
- 適合回溯算法解決的問題
- 全排列
- LeetCode:46.全排列
- LeetCode:78.子集
- 思考題
- 回顧
回溯算法是什么?
回溯算法是算法設計中的一種方法
回溯算法是一種漸進式尋找并構建問題解決方式的策略
回溯算法會先從一個可能的動作開始解決問題,如果不行,就回溯并選擇另一個動作,直到問題解決
有點類似鬼吹燈之尋龍訣,探險會碰到很多路,只能一條條試,不通就返回選擇另一條路
什么問題適合用回溯算法解決?
有很多路
這些路里,有死路,也有出路
通常需要遞歸來模擬所有的路
適合回溯算法解決的問題
全排列
子集
全排列
用遞歸模擬出所有情況
遇到包含重復元素的情況,就回溯
收集所有到達遞歸終點的情況,并返回
LeetCode:46.全排列
解題思路
要求:1、所有排列情況;2、沒有重復元素
有出路、有死路
考慮使用回溯算法
解題步驟
用遞歸模擬出所有情況
遇到包含重復元素的情況,就回溯
收集所有到達遞歸終點的情況,并返回
時間復雜度:O(n!),n!=123*…*(n-1)*n
空間復雜度:O(n)
LeetCode:78.子集
解題思路
要求:1、所有子集;2、沒有重復元素
有出路、有死路
考慮使用回溯算法
解題步驟
用遞歸模擬出所有情況
保證接的數字都是后面的數字
收集所有到達遞歸終點的情況,并返回
時間復雜度:O(2^N),因為每個元素都有兩種可能(存在或不存在)
空間復雜度:O(N)
思考題
1、說出回溯算法的套路步驟。
2、用回溯算法的套路步驟,描述走迷宮的過程,無需Coding。
回顧
數據結構:棧、隊列、鏈表、集合、字典、樹、圖、堆
算法:鏈表/樹/圖的遍歷、數組的排序和搜索…
算法設計思想:分而治之、動態規劃、貪心。回溯
重點難點
數據結構:所有數據結構都很重要,跟前端最相關的是鏈表和樹
算法:鏈表/樹/圖的遍歷、數組的排序和搜索…
設計思想:分而治之、動態規劃較常考,貪心、回溯次之
經驗心得
搞清楚數據結構與算法的特點和應用場景
用JS實現一遍,最好能用第二第三語言再實現一遍
學會分析時間/空間復雜度
提煉前端和算法的結合點,用于工作實戰
拓展建議
多刷題,最好能保證300道以上
多總結各種套路、模板
多閱讀源碼,比如React、Lodash、V8
多實戰,將數據結構與算法用于工作
總結
以上是生活随笔為你收集整理的(十五)算法设计思想之“回溯算法”的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: (十四)算法设计思想之“贪心算法”
- 下一篇: 个人手机银行怎么给对公账户转钱