這兩天做leetcode發現自己對乙個遞迴/動規的問題容易想錯,特此來總結一下總共3道題
乙個是前幾天碰見的面試題,給定乙個二叉樹還有乙個給定的數值,讓找到這課二叉樹是否有一條路徑上的值的和剛好等於給定的值(這裡的路徑只能從父節點到子節點)
leetcode 1367 這道題是相當於上面的變體,給定乙個二叉樹還有乙個鍊錶,判斷二叉樹上是否有一條路徑剛好等於鍊錶上的那條路徑。
第三題也是leetcode上的一題,但是忘了哪道了。記得是乙個字串裡,需要計算最長滿足另外乙個字串的連續子串的問題。
上面的三個問題容易犯乙個共同的錯誤就是遞迴去做這道題的時候,遞迴函式容易寫成如下(比如以第二題為例):
bool issubpath
(listnode* head, treenode* root)
每個遞迴函式裡面有如下幾種情況:
當head->val == root->val
時可以搜尋下一步
不論上一步是否相等,都可以保留完整的鍊錶,如匹配root的兩個子節點
但是按照上面函式的寫法,我是想讓這個函式表示,以root作為起始搜尋的情況下,root也不一定作為那條路徑的開始節點,來找到是否包含這個。
但是這樣做會出現如下一種反例,就是head前k個滿足root的路徑,一直搜尋到不滿足時,它會不選當前的root,同時從root的子節點開始匹配head中k+1之後的情況,這種情況下,會讓一些原本false的情況搜尋成true。
所以對於這種情況只能挨個搜尋,即先寫乙個必須包含當前root開始搜尋的函式1,外層函式2是,遍歷每個root看其是否滿足上面的函式1
即正確的做法如下:
bool issubpath
(listnode* head, treenode* root)
bool ispuresubpath
(listnode* head, treenode* root)
之前的第三題,我也犯了類似的錯誤,就是按照那種方式遍歷,但是這樣會出現中間斷開之後再搜尋的情況。 一道偶然邂逅的動規引發的首篇隨筆
個人業餘愛好 以後會堅持每天至少一篇新隨筆,希望大家多多監督 支援和交流 摘要 這是博主第一篇追隨演算法學習的心得體會,關於一道簡單的動態規劃題目,力求簡明扼要,聚焦交流學習 正題 1.丟擲題目 對問題的初步理解 眾所周知,牛妹有很多很多粉絲,粉絲送了很多很多禮物給牛妹,牛妹的禮物擺滿了地板。地板是...
一道用遞規做的題目
題目 在乙個線性七個格位置的圖上有兩種不同顏色的棋子a,b。排列如下圖所示,中間的位置 為空。a a ab b b 要求將a,b的現行位置交換,形成下圖中的排列 b b ba a a 移動棋子的要求 每個格中只准放乙個棋子。任意乙個棋子均可移動一格放入空格內。任何的旗子不得跳躍兩個或兩個以上的旗子。...
一道TCL的筆試題 遞迴
題目 在下面這個程式片段中的劃線處填上適當的表示式,使之逆序輸出陣列元素。void recur int a,int k 這道題目要用遞迴的思想完成陣列元素的逆序排列,我們先來複習一下有關遞迴函式一般解題思路。一般而言,遞迴函式要有乙個恰當的返回條件,以便到達那個條件的時候返回,不至於無窮巢狀進去,因...