?LeetCode刷題實(shí)戰(zhàn)310:最小高度樹
示例



解題
class Solution {
public:
vector<int> findMinHeightTrees(int n, vector<vector<int>>& edges) {
//處理特殊的情形
if(n==1){
return {0};
}
if(n==2){
return {0,1};
}
//建立圖
vector<vector<int>> graph(n);
//統(tǒng)計(jì)各個(gè)結(jié)點(diǎn)的入度,這里是無向圖,實(shí)際既相鄰的結(jié)點(diǎn)的數(shù)量
vector<int> in_degree(n,0);
for(vector<int>& edge:edges){
graph[edge[0]].push_back(edge[1]);
graph[edge[1]].push_back(edge[0]);
++in_degree[edge[0]];
++in_degree[edge[1]];
}
queue<int> q;//隊(duì)列實(shí)現(xiàn)廣度優(yōu)先搜索
//將起始的度為1的結(jié)點(diǎn)壓入到隊(duì)列中
for(int i=0;i<n;++i){
if(in_degree[i]==1){
q.push(i);
in_degree[i]=0;//標(biāo)識不再訪問,變相的刪除結(jié)點(diǎn)操作
}
}
//當(dāng)沒有遍歷的結(jié)點(diǎn)的數(shù)量小于等于2時(shí),則終止循環(huán),剩余的這1個(gè)或2個(gè)結(jié)點(diǎn),即為中間結(jié)點(diǎn)
while(n>2){
int cur_size=q.size();//當(dāng)前層要?jiǎng)h除的結(jié)點(diǎn)數(shù)量
n-=cur_size;//刪除結(jié)點(diǎn)
//逐個(gè)遍歷要?jiǎng)h除的結(jié)點(diǎn),減少相鄰的結(jié)點(diǎn)的度
while(cur_size--){
int cur_index=q.front();//當(dāng)前結(jié)點(diǎn)
q.pop();
//遍歷當(dāng)前結(jié)點(diǎn)的相鄰結(jié)點(diǎn),再相鄰結(jié)點(diǎn)沒有被刪除過的情形下,既度符合要求的情形下
for(int& cur_i:graph[cur_index]){
if(in_degree[cur_i]>1){//度符合要求,則可以訪問
//該相鄰結(jié)點(diǎn)的度減1
--in_degree[cur_i];
//若度等于1,則說明也是新的葉子結(jié)點(diǎn),既可以刪除的結(jié)點(diǎn),壓入到隊(duì)列中,并將對應(yīng)的度置為0進(jìn)行標(biāo)識
if(in_degree[cur_i]==1){
q.push(cur_i);
in_degree[cur_i]=0;
}
}
}
}
}
//獲得結(jié)果
vector<int> res;
while(!q.empty()){
res.push_back(q.front());
q.pop();
}
return res;
}
};
LeetCode1-280題匯總,希望對你有點(diǎn)幫助!
LeetCode刷題實(shí)戰(zhàn)301:刪除無效的括號
