回溯法(其实是递归)
關于回溯算法,你該了解這些!別看回溯法很難,但回溯法就是暴力解法?https://mp.weixin.qq.com/s?__biz=MzUxNjY5NTYxNA==&mid=2247485237&idx=1&sn=1bae4c3d0d3965af44878093a5a49f58&scene=21#wechat_redirect其中博主這段話令我領悟了回溯法的精髓,要懂回溯,首先要明白我們為什么要用回溯?
力扣題目鏈接:https://leetcode-cn.com/problems/combinations/
給定兩個整數 n 和 k,返回 1 ... n 中所有可能的 k 個數的組合。
示例: 輸入:?n = 4, k = 2 輸出: [ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ]
直接的解法當然是使用for循環,例如示例中k為2,很容易想到 用兩個for循環,這樣就可以輸出 和示例中一樣的結果。
int n = 4; for (int i = 1; i <= n; i++) {for (int j = i + 1; j <= n; j++) {cout << i << " " << j << endl;} }輸入:n = 100, k = 3 那么就三層for循環,代碼如下:
int n = 100; for (int i = 1; i <= n; i++) {for (int j = i + 1; j <= n; j++) {for (int u = j + 1; u <= n; n++) {cout << i << " " << j << " " << u << endl;}} }如果n為100,k為50呢,那就50層for循環,是不是開始窒息。
此時就會發現雖然想暴力搜索,但是用for循環嵌套連暴力都寫不出來!
咋整?
回溯搜索法來了,雖然回溯法也是暴力,但至少能寫出來,不像for循環嵌套k層讓人絕望。
那么回溯法怎么暴力搜呢?
上面我們說了要解決 n為100,k為50的情況,暴力寫法需要嵌套50層for循環,那么回溯法就用遞歸來解決嵌套層數的問題。
遞歸來做層疊嵌套(可以理解是開k層for循環),每一次的遞歸中嵌套一個for循環,那么遞歸就可以用于解決多層嵌套循環的問題了。
此時遞歸的層數大家應該知道了,例如:n為100,k為50的情況下,就是遞歸50層。
一些同學本來對遞歸就懵,回溯法中遞歸還要嵌套for循環,可能就直接暈倒了!
如果腦洞模擬回溯搜索的過程,絕對可以讓人窒息,所以需要抽象圖形結構來進一步理解。
我們在關于回溯算法,你該了解這些!中說道回溯法解決的問題都可以抽象為樹形結構(N叉樹),用樹形結構來理解回溯就容易多了。
那么我把組合問題抽象為如下樹形結構:
組合問題!https://mp.weixin.qq.com/s?__biz=MzUxNjY5NTYxNA==&mid=2247494135&idx=2&sn=3a17829d16a597246c20600a3a4bb2ce&chksm=f9a1daa6ced653b0a6fd720febab7a48df94090d44b1a686431b094e0d602f5d89fc1bd65744&scene=178&cur_album_id=1607983171550167042#rd?
?
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的回溯法(其实是递归)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 二分法(三种基本模版)
- 下一篇: 机器学习(三)聚类深度讲解