面試演算法 深度優先搜尋

2021-10-16 22:40:41 字數 2089 閱讀 6421

四、題目

二叉樹的題型中有很大一部分是用dfs解決,下面是二叉樹題型的歸納:

使用dfs,在乙個集合中得到所有滿足條件的排列或者組合。模版如下:

public list

main

(array arr)

private

void

getcombination

(array arr,

int startindex,

list comb,

list

combs)

}private

void

getpermutation

(array arr,

array visited,

list permu,

list

permus)

//每次從頭到尾挑選乙個沒被選過的元素(用visited來記錄是否被選過)

for(

int i =

0; i < nums.length; i++

)/* 如果有重複元素

if (i > 0 && nums[i] == nums[i - 1] && visited[i - 1] == 0)

*/comb.

add(nums[i]);

visited[i]

=true

;dfs

(arr, i +

1, permu, permus)

; visited[i]

=false

; comb.

remove

(nums[i]);

}}

如果有重複元素怎麼辦?

比如求abb的組合,答案為[, [a] [b], [a, b], [b, b], [a, b, b]]

如果使用以上模版,會得到答案[, [a], [b], [b], [a, b], [a, b], [b, b], [a, b, b]]

問題在於b被選擇了兩次,所以要多加乙個條件來避免重複選擇。

模版如下,只有很小的改動:

//如果集合中有重複元素,需要在dfs的過程中加入一些判斷條件。

private

void

getcombinationdup

(array arr,

int startindex,

array visited,

list comb,

list

combs)

comb.

add(nums[i]);

visited[i]

=true

;dfs

(arr, i +

1, comb, combs)

; visited[i]

=false

; comb.

remove

(nums[i]);

}}private

void

getpermutation

(array arr,

array visited,

list permu,

list

permus)

for(

int i =

0; i < nums.length; i++)if

(i >

0&& nums[i]

== nums[i -1]

&& visited[i -1]

==0) comb.

add(nums[i]);

visited[i]

=true

;dfs

(arr, i +

1, permu, permus)

; visited[i]

=false

; comb.

remove

(nums[i]);

}}

這是深度優先搜尋中變化最多的題目,偏難。

題目一般會給出乙個矩陣,然後在矩陣中使用dfs。此外,也有的題並沒有給出矩陣,需要靠自己抽象出乙個圖在使用dfs。

這個型別的題沒有模版,需要靠不斷練習找解題思路。

深度優先搜尋演算法

include include define vertexnum 9 struct node typedef struct node graph struct node head vertexnum 定義圖形結構 int visited vertexnum 頂點陣列 深度優先搜尋 void dfs ...

深度優先搜尋演算法

今天我們來複習一下萬能的搜尋演算法之深度優先搜尋演算法。深度優先搜尋演算法顧名思義就是按照樹的延伸不停的往下搜尋,直到樹的盡頭之後再一步一步的回溯回來。好吧,我們直接問你乙個問題,給你乙個數n,讓你輸出從1到這個樹的全排列,你會怎麼寫,會不會想到去用若干個for迴圈?好吧,你肯定錯了,其實他考的就是...

深度優先搜尋演算法

1.深度優先搜尋演算法的概念 深度優先搜尋屬於圖演算法的一種,英文縮寫為dfs depth first search.其過程簡要來說是對每乙個可能的分支路徑深入到不能再深入為止,而且每個 節點只能訪問一次。如下例 該圖為乙個無向圖,假設我們從a開始進行深度優先搜尋,第二點可以是b c d中任意乙個,...