日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

回溯法基本思想_数据结构之简单的回溯算法

發布時間:2025/4/16 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 回溯法基本思想_数据结构之简单的回溯算法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

回溯算法在數據結構中是一種常用的算法,也是一種暴力求解法,基本思想是深度遍歷,選擇一條路一步一步走,當走不通的時候或者已經求得正確的結果,返回上一步,接著選擇另一條路走,直到遍歷完所有節點。

回溯算法是一種思想,真正用代碼實現的時候,大多時候都需要用的方法是遞歸。

一. 回溯算法最出名的是8皇后問題,8皇后問題是在8*8格的棋盤上擺放8個皇后,使得這個8個皇后不在同一行上,也不在不一列上,也不在同一個對角線上,問有多少種擺法?

這個問題的解法是典型的回溯算法:

  • 在第一行的某一個位置放置一個皇后,當然是從第一個位置開始。
  • 接著在第二行的找一個可以擺放皇后的位置,條件就是不在同一行,不在不一列也不在同一斜線上,如果找到則進行下一行的查找,如果找不到,則回退到第一行的位置重新查找第一個皇后的位置,依次類推,直到8個 皇后都放到棋盤上。
    代碼入下:

  • 上面的代碼最主要的方法是recursionQueen,recursion是遞歸的意思,想象一下8*8的棋盤,參數row為0,從第一行開始,第一行的第一個位置符合條件,放置一個皇后,接著遞歸調用recursionQueen,row參數為1代表第二行,第二行的第一列檢查不符合條件,因為位于同一列,接著看第二列,同樣不符合條件,接著看看第三列,符合條件,接著在遞歸調用recursionQueen,row為2表示第三行,放置第三個皇后,一次類推,直到第八行,第8個皇后符合條件之后,這就找出了第一種正確的擺放位置。

  • 刪除最后一個皇后,在第8行接著找,直到遍歷完第8行找到全部的擺放位置。第8行遍歷完之后,也就走完了for循環,刪除第7行存在列表中皇后,在第七行接著尋找下一個符條件的皇后,找到之后接著在遞歸調用recursionQueen這個方法,尋找第8行符合條件的皇后。等到第7行遍歷完了之后接著刪除第六行的皇后,接著第六行遍歷,尋找第六行下一個符合條件的皇后,一次類推即可。
    以上就是8皇后問題,寫的有點繞,多讀幾遍總能讀懂。
    在做幾個回溯問題,鞏固一下:
  • 二. 看下LeetCode中的 17. 電話號碼的字母組合這個問題,問題描述如下:

    給定一個僅包含數字 2-9 的字符串,返回所有它能表示的字母組合。
    給出數字到字母的映射如下(與電話按鍵相同)。注意 1 不對應任何字母。

    輸入:"23"

    輸出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].

    這個問題的解法和8皇后問題類似,比如輸入為23的時候,2中的所有字母代表一行,3中的所有字母代表第二行,那么就可以一次遞歸調用某一行的字母進行組合,代碼入下:

    上面的代碼也不是很難理解,每一個數字代表幾個字母,用其中的字母來進行循環組合,一次遞歸調用,當組合的長度和給的digits長度一致的時候,說明這次組合成功,并刪除最后一個字母,接著循環,尋找下一個符合條件的字母。

    三. 在看一個LeetCode中37. 解數獨 :
    編寫一個程序,通過已填充的空格來解決數獨問題。

    一個數獨的解法需遵循如下規則:

    數字 1-9 在每一行只能出現一次。
    數字 1-9 在每一列只能出現一次。
    數字 1-9 在每一個以粗實線分隔的 3x3 宮內只能出現一次。
    空白格用 '.' 表示。

    代碼入下:

  • 遍歷二維數組,當遇到點的時候,從1到9開始嘗試,判斷是不是滿足條件,如果滿足,用當前的數字替換點,
  • 遞歸調用,因為上一個點已經被替換了,接著遍歷二維數組,尋找下一個是的點的位置,找到之后在遍歷1到9查找符合條件的字符,找到之后接著再遞歸,還是走2
  • 如果遍歷完了一到9,還是沒有符合條件的,則返回false,證明此路不通,開始回溯,把已經負責的數字用點還原回去,在接著從1到9中尋找合適的數字
  • 如此遞歸回溯,直到找到合適的為止。
  • 四。 再看一個39. 組合總和
    給定一個無重復元素的數組 candidates 和一個目標數 target ,找出 candidates 中所有可以使數字和為 target 的組合。

    candidates 中的數字可以無限制重復被選取。

    說明:

    所有數字(包括 target)都是正整數。
    解集不能包含重復的組合。
    示例 1:

    輸入: candidates = [2,3,6,7], target = 7,
    所求解集為:
    [
    [7],
    [2,2,3]
    ]
    示例 2:

    輸入: candidates = [2,3,5], target = 8,
    所求解集為:
    [
    [2,2,2,2],
    [2,3,3],
    [3,5]
    ]

    這道題目用回溯算法也很簡單,思想是從第一個元素開始,如果比目標值小加到列表中,遞歸遍歷,并把目標值和第一個元素的差值,還有開始遍歷的起始位置傳遞過去,

  • 從起始位置開始遍歷,和目標值比較,
  • 如果和目標值相等,找到對應的素組,然后刪除列表的最后一個元素,接著遍歷
  • 如果比目標值大的話,忽略,繼續遍歷
  • 當一次循環做完,刪除上一次遞歸插入的元素值
    代碼入下:
  • 上面的代碼可以排序也可以不排序。 如果傳值start,每次遞歸調用都加1的話就成了不重復的元素了。

    回溯算法看這幾個例子就差不多了吧。還想刷題鞏固的話 可以看LeetCode上面搜索關于回溯的題練習。

    再小的努力,乘以365天也會變的偉大!歡迎關注我的公眾號 :北風中獨行的蝸牛

    總結

    以上是生活随笔為你收集整理的回溯法基本思想_数据结构之简单的回溯算法的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。