二叉樹裡已經大量使用了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 以下兩題思路類似。合併區間 插入區間 引用指數 ...