一道遞迴 動規易錯題的總結

2021-10-03 11:28:46 字數 1070 閱讀 7989

這兩天做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 這道題目要用遞迴的思想完成陣列元素的逆序排列,我們先來複習一下有關遞迴函式一般解題思路。一般而言,遞迴函式要有乙個恰當的返回條件,以便到達那個條件的時候返回,不至於無窮巢狀進去,因...