九章演算法第四課,BFS

2021-09-10 02:02:57 字數 4266 閱讀 1169

69. 二叉樹的層次遍歷

class solution 

res.push_back(tmp);

} return res;

}};

7. 二叉樹的序列化和反序列化

注意小細節和各種函式的用法。

class solution 

if (j!=data.length())

return results;

}public:

string serialize(treenode * root)

else res=res+','+to_string(h.front()->val);

h.push(h.front()->left);

h.push(h.front()->right);

h.pop();

}//把末尾多餘的,#去掉

while (res[res.size()-1]==',' ||res[res.size()-1]=='#')

res.erase(res.size()-1,1);

return res;

}treenode * deserialize(string &data)

i++;

if (i>=vals.size()) break;

if (vals[i]=="#") tmp->right==null;

else

h.pop();

}return head;

}};

70. 二叉樹的層次遍歷 ii

最後把遍歷結果倒過來即可。

class solution 

res.push_back(level);

}reverse(res.begin(),res.end());

return res;

}};

71. 二叉樹的鋸齒形層次遍歷

class solution 

if (!order)

order=!order;

res.push_back(level);

}return res;

}};

242. 將二叉樹按照層級轉化為鍊錶

class solution 

res.push_back(head->next);

}return res;

}};

178. 圖是否是樹

判斷圖是不是樹的兩個標準:1.n個節點有n-1條邊 2.通過n-1條邊可以訪問到全部n個節點;

實現起來有幾點要注意:1.使用set記錄已經訪問到的節點;2.使用vector>重構所給出的邊的關聯資訊,這樣可以不用每次重新遍歷一遍給出的邊關係(已知序號為0-n-1可以直接用hash表,注意vector的初始化資訊);3.遍歷時使用auto更好寫。

class solution }}

return record.size()==n;

}};

137. 轉殖圖

第一步:通過node找到所有的nodes,並存在乙個vector裡;

第二步:根據nodes,新建每個node對應的newnode(對應關係存在map裡);

第三步:建立neiborghs關係。

class solution 

for (auto a:list)

}return relation[node];

}vectorgetnodes(undirectedgraphnode *node)

}h.pop();

}return list;

}};

618. 搜尋圖中節點

按照廣搜,最先找到的點就是最近的點。

class solution 

h.pop();

}return null;

}};

605. 序列重構

這個題也相當於拓撲排序,給的seqs相當於幾組關係,每乙個數指向後面乙個數;返回false的條件有三個:1.可能重構出多個陣列(判斷方法為佇列裡不能同時有兩個元素,或者給的關係比org短) 2.重構的陣列和org不一樣(在bfs裡判斷) 3.其他越界情況

class solution 

}if (lengthh;

for (int i=1;i<=n;i++)

vectorres;

while (h.size()==1)

h.pop();

//如果當前恢復的數字和org不一樣,立刻終止;

if (res[res.size()-1]!=org[res.size()-1]) return false;

}return res.size()==n;

433. 島嶼的個數

bfs寫法,盡量用bfs;

class solution 

if (in_bound(grid,x+1,y)&&grid[x+1][y])

if (in_bound(grid,x,y-1)&&grid[x][y-1])

if (in_bound(grid,x,y+1)&&grid[x][y+1]) }}

bool in_bound(vector> &grid,int i,int j)

};

598. 殭屍矩陣

class solution 

bool in_bound(vector> &grid,int i,int j)

};

611. 騎士的最短路線

注意要把走過的點設定成障礙,防止來回跳。

class solution ;

if (source.x==destination.x && source.y==destination.y)

return 0;

int step=0;

queueh;

h.push(source);

grid[source.x][source.y]=1;

while (!h.empty())

};

573. 郵局的建立 ii

這道題如果從空地出發找到所有去房子的距離會超時;由於房子是少的,我們考慮從房子出發找到到達每個空地的最近距離,將距離累加,所有房子都能到達且距離最小的點即是郵局。注意一定要建立乙個num陣列記錄有幾個房子能到達這個空地,最後確認所有房子都能到達才有效。

class solution }}

int res=int_max;

int flag=false;

for (int i=0;i> &grid,int x,int y,

vector> &distance,

vector> &visited,

vector> &num)

};

431. 找無向圖的連通塊

注意vector內可能要求有序。

class solution  

h.pop();

}sort(graph.begin(),graph.end());

res.push_back(graph);

}return res;

}};

120. 單詞接龍

這道題我一開始的思路是將字典內的單詞構建乙個無向圖,將字母只差一位的單詞連線起來。如下**:

class solution 

queueh;

h.push(start);

v.insert(start);

int step=1;

while (!h.empty())

return true;

}};

但是最後乙個資料超時了,因為字典內的單詞太多了而能用到的單詞不多。所以轉換思路直接使用廣搜,列舉每個單詞每個位置上的字母,在字典中查詢是否存在,如果存在則加入佇列,直到找到end。

需要注意的兩點:1.使用erase()去掉已經修改過的單詞,不必再額外使用去重集合,注意把start刪除掉;

2.end有可能不在字典中,記得加入字典;

class solution    

}word[i]=oldchar;}}

step++;

}return -1;

}};

鋼琴第四課

因為此前每天都練琴,曲譜也都記住了,所以,週六,臨時被老師喊去時,非常自信。學到了很多知識。1.連貫性方面 連貫性要注意 其實,連貫性在於對曲目的熟練程度,手指的靈活程度,還有不同音之間的連貫跳躍 音要連續 不同音,要連續連線在一起 這個音落下,上個音才起來 2.節奏方面 四分音符要短快,彈到了,立...

Android OpenGL教程 第四課

android opengl 教程 第四課旋 在這一課裡,我將教會你如何旋轉三角形和四邊形。左圖中的三角形沿y軸旋轉,四邊形沿著x軸旋轉。我們增加兩個變數來控制這兩個物件的旋轉。這兩個變數加在程式的開始處其他變數的後面。它們是浮點型別的變數,使得我們能夠非常精確地旋轉物件。浮點數包含小數字置,這意味...

Linux基礎 第四課

nfs伺服器設定 安裝sudo apt get install portma 安裝sudo apt get install nfs kernel server 配置檔案etc exports 增加共享的目錄 ip2位址以及許可權 啟動服務 service portmap start 然後啟動服務 s...