Leetcode題解記錄 回溯

2021-10-24 11:55:58 字數 4505 閱讀 8600

給定乙個二維網格和乙個單詞,找出該單詞是否存在於網格中。

單詞必須按照字母順序,通過相鄰的單元格內的字母構成,其中「相鄰」單元格是那些水平相鄰或垂直相鄰的單元格。同乙個單元格內的字母不允許被重複使用。

board =

[[『a』,『b』,『c』,『e』],

[『s』,『f』,『c』,『s』],

[『a』,『d』,『e』,『e』]

]給定 word = 「abcced」, 返回 true

給定 word = 「see」, 返回 true

給定 word = 「abcb」, 返回 false

board 和 word 中只包含大寫和小寫英文本母。

1 <= board.length <= 200

1 <= board[i].length <= 200

1 <= word.length <= 10^3

思路:

回溯的思想其實也是暴力的一種

找到第乙個與word[0]字母相同的字母,然後從她的四個方向查詢,找之前將該節點元素儲存,源位置置換為『\0』,保證下一次不會查詢到這個元素,等回退到這一層時在還原該元素。

只有當index和word.size()-1相等時,代表所有元素查詢完成並存在,返回真

當查詢範圍超出界限,或者與當前word[index]不相等,則返回假,回退。

class

solution

bool

exist

(vectorchar

>>

& board, string word)

}return

false;}

};

給定乙個 沒有重複 數字的序列,返回其所有可能的全排列。

輸入: [1,2,3]

輸出:[

[1,2,3],

[1,3,2],

[2,1,3],

[2,3,1],

[3,1,2],

[3,2,1]

]

思路:

結束條件:當每輪路徑儲存的元素與nums元素的個數一致時,返回

選擇列表:visited[i] == false, 回溯的時候如果需要避免一些未被訪問的元素,我們新增visited陣列表示

回退操作:路徑陣列中彈出這輪迴圈中的元素,visited重新置未false

class

solution

for(

int i =

0; i < nums.

size()

;++i)

} vectorint>>

permute

(vector<

int>

& nums)

};

給定乙個無重複元素的陣列 candidates 和乙個目標數 target ,找出 candidates 中所有可以使數字和為 target 的組合。

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

說明:所有數字(包括 target)都是正整數。

解集不能包含重複的組合。

輸入:candidates = [2,3,6,7], target = 7,

所求解集為:

[[7],

[2,2,3]

]

思路:

終止條件:組合和為大於等於target,等於時儲存,大於時回退

選擇列表:由於元素可以被無限次數使用,所以不需要visited陣列

回退列表:將當前元素彈出,目標和對應減去

去重:每次查詢只需要以當前元素為起點查詢即可

class

solution

else

if(target <0)

return

;for

(int i = index; i < candidates.

size()

;++i)

} vectorint>>

combinationsum

(vector<

int>

& candidates,

int target)

};

數字 n 代表生成括號的對數,請你設計乙個函式,用於能夠生成所有可能的並且 有效的 括號組合。

輸入:n = 3

輸出:[

「((()))」,

「(()())」,

「(())()」,

「()(())」,

「()()()」

]

思路:

終止條件:

class

solution

void

func

(vector

&res, string str,

int l,

int r,

int n)

func

(res, str +

'(', l+

1, r, n)

;func

(res, str +

')', l, r+

1, n)

;return;}

};

給你乙個由 『1』(陸地)和 『0』(水)組成的的二維網格,請你計算網格中島嶼的數量。

島嶼總是被水包圍,並且每座島嶼只能由水平方向或豎直方向上相鄰的陸地連線形成。

此外,你可以假設該網格的四條邊均被水包圍

輸入:[[

'1',

'1',

'1',

'1',

'0'],[

'1',

'1',

'0',

'1',

'0'],[

'1',

'1',

'0',

'0',

'0'],[

'0',

'0',

'0',

'0',

'0']

]輸出:

1

class

solution

grid[i]

[j]=

'0';

dfs(grid, i-

1, j)

;dfs

(grid, i+

1, j)

;dfs

(grid, i, j-1)

;dfs

(grid, i, j+1)

;return;}

intnumislands

(vectorchar

>>

& grid)}}

return res;}}

;

給定乙個包含了一些 0 和 1 的非空二維陣列 grid 。

乙個 島嶼 是由一些相鄰的 1 (代表土地) 構成的組合,這裡的「相鄰」要求兩個 1 必須在水平或者豎直方向上相鄰。你可以假設 grid 的四個邊緣都被 0(代表水)包圍著。

找到給定的二維陣列中最大的島嶼面積。(如果沒有島嶼,則返回面積為 0 。)

[[0

,0,1

,0,0

,0,0

,1,0

,0,0

,0,0

],[0

,0,0

,0,0

,0,0

,1,1

,1,0

,0,0

],[0

,1,1

,0,1

,0,0

,0,0

,0,0

,0,0

],[0

,1,0

,0,1

,1,0

,0,1

,0,1

,0,0

],[0

,1,0

,0,1

,1,0

,0,1

,1,1

,0,0

],[0

,0,0

,0,0

,0,0

,0,0

,0,1

,0,0

],[0

,0,0

,0,0

,0,0

,1,1

,1,0

,0,0

],[0

,0,0

,0,0

,0,0

,1,1

,0,0

,0,0

]]對於上面這個給定矩陣應返回 6。注意答案不應該是 11 ,因為島嶼只能包含水平或垂直的四個方向的 1 。

class

solution

intmaxareaofisland

(vectorint>>

& grid)}}

return res;}}

;

leetcode題解 遞迴和回溯法

現在我們來看遞迴演算法中非常經典的思想回溯法,這樣的演算法思想通常都應用在一類問題上,這類問題叫做樹型問題,這類問題他本身沒有定義在一顆二叉樹中,但我們具體分析這個問題時就會發現解決這個問題的思路本質是一顆樹的形狀。解題思路比如我們輸入的digits 23 2能代表abc三個字母,當2代表a時,3代...

回溯 leetcode回溯演算法

回溯演算法實際上乙個類似列舉的搜尋嘗試過程,主要是在搜尋嘗試過程中尋找問題的解,當發現已不滿足求解條件時,就 回溯 返回,嘗試別的路徑。回溯法是一種選優搜尋法,按選優條件向前搜尋,以達到目標。但當探索到某一步時,發現原先選擇並不優或達不到目標,就退回一步重新選擇,這種走不通就退回再走的技術為回溯法,...

回溯演算法詳解及Leetcode經典例題解答

在程式設計中,有相當一類求一組解,或求全部解或求最優解的問題,例如讀者熟悉的八皇后問題,不是根據某種特定的計算法則,而是利用試探和回溯的搜尋技術求解。回溯法也是設計遞迴過程的一種重要方法,它的求解過程實質上是乙個先序遍歷一棵 狀態樹 的過程,只是這棵樹不是遍歷前預先建立的,而是隱含在遍歷過程中。資料...