球球速刷LC BFS DFS 二輪

2021-10-07 04:06:22 字數 4326 閱讀 5650

二叉樹裡已經大量使用了dfs,bfs,二叉樹的前序遍歷,中序遍歷 後序遍歷就是dfs,層序遍歷

就是bfs。

對於二叉樹這種具有單向分層結構,進行dfs bfs時無需擔心會重複訪問,但是對於無向圖或者

有向有環圖等結構,需要使用輔助資料結構來記錄當前節點是否已經訪問過。

島嶼數目!!!

class

solution

public

:int

numislands

(vectorchar

>>

& grid)}}

return island_num;}}

;

包圍區域!!!

先將所有與邊緣連通的o標記為其他字元y,在將剩餘o翻轉為x。最後恢復y

class

solution

; vector<

int>y_directions=

;for

(int k=

0;k<4;

++k)}}

}public

:void

solve

(vectorchar

>>

& board)

if(board[i]

[n-1]==

'o')

}for

(int i=

0;i++i)

if(board[m-1]

[i]==

'o')

}for

(int i=

0;i++i)}}

};

矩陣裡搜尋單詞

經典的四向搜尋問題。

#define up 0

#define down 1

#define left 2

#define right 3

bool

backtrak

(const vectorchar

>

>

&board ,

const string& word,

int row ,

int col,

int pos,vectorbool

>

>

& record)

record[row]

[col]

=false

;return

false;}

class

solution

}return

false;}

};

拷貝圖

可以利用map同時起到判斷是否第一次訪問,以及記錄當前節點的拷貝節點的位址的作用。

class

solution

}else

return pcurr;}}

;

太平洋大西洋出海口

分別標記能流入太平洋的位置以及能流入大西洋位置。二者均能流入則為所求

class

solution

;int direction_y[4]

=;for(

int k=

0;k<4;

++k)}}

public

: vectorint>>

pacificatlantic

(vectorint>>

& matrix)

for(

int i=

0;i++i)

for(

int i=

0;i++i)

for(

int i=

0;i++i)

for(

int i=

0;i++i)

; ret.

push_back

(r);}}

}return ret;}}

;

最長增長路徑!!!

對每個位置,訪問比自己大的鄰接點,並且更新從當前位置出發能達到的最大增長長度

class

solution

; vector<

int> delta_y=

; mark[i]

[j]=1;

for(

int k=

0;k<4;

++k)

else}}

}return mark[i]

[j];

}public

:int

longestincreasingpath

(vectorint>>

& matrix)

}return ret;}}

;

單詞接龍

通過bfs按層遍歷,思路比較直接

void

getnextwords

(const string &currword , queue

& nextlayer ,unordered_set

& worddict)}}

}}class

solution

if(nextlayer.

empty()

)return0;

//無法推導出最終詞彙

++nlayer;

while

(!nextlayer.

empty()

)}}}

;

課表問題1

本質是尋找乙個圖里是否有環

構建圖可以使用鄰接矩陣等多種方式,以下**為簡單,直接使用陣列記錄乙個節點的父節點和子節點。

bfs判斷是否有環方法:

訪問乙個節點時,只有其所有父節點已經被訪問過,才訪問當前節點。從而保證不會訪問成環。

此處每次訪問某節點時,更新其子節點裡記錄父節點被訪問的個數。

最終如果所有節點均被訪問到,證明圖里不存在環。

dfs判斷是否有環方法:

記錄當前路徑上被訪問的序列,如果發現當前節點的子節點已經被訪問,則證明存在環。

struct node

;class

solution}}

while

(!q.

empty()

)}}}

for(

auto v:visited)

return

true;}

vector<

bool

>visited;

bool

dfs_no_loop

(node&root,vector

&tree,vector<

bool

>

&visited,vector<

bool

>

&curr_path_visit)

else

curr_path_visit[child]

=false;}

}}return

true;}

public

:bool

canfinish

(int numcourses, vectorint>>

& prerequisites)

///use bfs ------

return

bfs_no_loop

(tree)

;for

(auto

&r:tree)

else}}

for(

auto i:visited)

return

true;}

};

課表問題2

採用課表1中的bfs方法,訪問所有節點,其順序即為可行的上課順序

struct node

;vector<

int>

bfs(vector

&graph)}}

while

(!q.

empty()

)}}}

bool all_visit=

true

;for

(auto i:visit)

}return ret;

}class

solution

return

bfs(graph);}

};

球球速刷LC之雙指標 二輪

無序兩數之和 對於當前num i 要找的是target num i 可利用集合逐漸構建搜尋集合 class solution table nums i i return ret 有序數字兩數之和 採用雙指標 class solution return ret else if curr else if...

球球速刷LC 貪心

貪心的思路很簡單 在對問題求解時,總是做出在當前看來是最好的選擇。也就是說,不從整體最優上加以考慮,它所做出的僅僅是在某種意義上的區域性最優解,也就是當前最貪婪的解。跳躍遊戲1 維護乙個當前所能到達的視窗,並在這個視窗內遍歷每個點,看能達到的最遠距離farest。從而將視窗更新到當前視窗 end 1...

球球速刷LC 排序

最大數字 將字串排序,兩兩比較,二者組成的數字越大,則對於字串在前面。bool cmp const string a const string b class solution if result 0 0 result 0 return result 以下兩題思路類似。合併區間 插入區間 引用指數 ...