儲存0入度元素
14for (int i = 0; i < numcourses; ++i)
18while (!queue.isempty())26}
27return count == numcourses; //
判斷拓撲排序元素個數是否與課程數一致28}
29 }
解題思路:根據題目中先修課程的描述,其與有向圖的構造類似,而判斷最終是否可以完成,則是相當於判斷有向圖內是否成環。這種有向圖的判斷是經典的拓撲排序。我們只需要根據最後拓撲排序後的結果,檢視是否所有課程都在其中即可。
先了解下什麼是拓撲排序。
給定乙個包含 nn 個節點的有向圖 gg,我們給出它的節點編號的一種排列,如果滿足:
那麼稱該排列是圖 gg 的「拓撲排序」。
而當乙個有向圖成環時,顯然是違背拓撲排序的特點的,因為對於環內任意元素,我們都無法確定究竟是誰在誰之前。
了解了拓撲排序,那麼就要開始設計演算法實現它。
根據拓撲排序的特點,我們如果將所有的節點的入度計算出來,那麼顯然入度為0的節點,代表沒有任何節點指向它,那麼它一定能夠出現在拓撲排序的前端。那麼當我們將入度為0的節點新增入結果序列後,而當新增該節點後,我們就需要在有向圖中擦去該節點,簡單來說,對於這些節點來說,它們所指向的節點的入度將會-1。然後我們繼續尋找入度為0的節點,直到沒有入度為0的節點。
而看到這,有沒有發現有一絲的眼熟?對的,這實際上就是一種廣度優先的遍歷!
所以我們可以使用廣度優先遍歷的模板,定義乙個佇列來維護入度為0的節點,出隊後,計算該出隊節點的後繼節點的入度,若為0,則將其入隊,迴圈操作,直到隊列為空。
注意點:
由於題目要求中,下標為1的數是下標為0的數的先修課程,所以構造有向圖時需反著構造,下標為1的課程在前,下標為0的課程在後。
時間複雜度:o(m+n),m,n為課程數與先修課程的要求數
空間複雜度:o(m+n)
2020 7 23 力扣每日
解題思路 這是一道經典的動態規劃題目,由於移動方向為向右與向下,說明除了第一行第一列以外,其餘點的對應最小路徑和,只可能是從左移動至當前位置的路徑和,或是從上方移動至當前位置的路徑和。我們使用二維陣列dp row col 儲存所有點的對應路徑和情況。用up,left分別儲存從上,與從左的兩種情況,顯...
2020 7 21 力扣每日
解題思路 該題與先前的7.15日的每日一題相似,兩者都是不同的二叉搜尋樹,不同的是,先前只需返回總數,而該題需要返回所有的樹,但解題思路是相似的,要解決根節點的情況就要解決左右子樹的情況,這裡同樣可以使用動態規劃來實現,但此處先用遞迴來實現,便於理解。根據二叉搜尋樹的性質,顯然,i作為根節點時的左子...
2020 7 17 力扣每日
解題思路 對於該題要求,顯然可以利用暴力法即順序查詢的方法查詢元素插入位置,但這顯然不是最優解法。此時很容易想到利用二分查詢法,由於該題陣列內可能不存在插入的元素,所以需要略微修改下二分查詢的演算法,搜尋到最後乙個小於目標的元素,插入到它的後面,或搜尋到第乙個大於等於目標的元素,插入到它的當前位置。...