面試演算法 遞迴解讀

2021-10-11 05:54:26 字數 3218 閱讀 7615

方**:

看題五分鐘,不會做,看解析;

先看中文站,再看國際站;

選擇最優解析;

回頭再來寫

面試四步走:

和面試官,**題目限制條件;

說說可能解,選擇最優解;

碼字;跑測試用例

思維要點:

不要人肉進行遞迴

找到最近最簡方法,將其拆解成可重複解決的問題(重複子問題)

數學歸納法思維

找到一種寫**的感覺!!!

void recur(int level, int param) 

// process current logic

process(level, param);

// drill down

recur(level: level + 1, newparam);

// restore current status

}

c++種stringstream介紹,這裡需要注意getline的用法;

// extract to string

#include #include #include int main ()

可能解:

遞迴求解

迭代求解

# 1. 遞迴求解

class solution

};

# 2. 迭代求解

class solution

res++;

}return res;

}};

可能解:

遞迴求解

# 1. 遞迴求解

class solution

};

可能解:

定義函式help(bottom. root. upper)

利用二叉搜尋樹中序遍歷有序性,驗證二叉搜尋樹;

# 1t

class solution

private:

bool helper(long long bottom, treenode* root, long long upper)

};

isvalidbst(root)的定義為:如果以root為根的樹為 bst, 那麼改函式返回ture,否則返回false;以下為中序遞迴的模板!!!

# 2t

class solution

if (pre != nullptr && pre->val >= root->val)

pre = root;

if (!isvalidbst(root->right))

// restore current status

return true;

}};

以下會寫三種方法,其中第一種、第二種類似(同為遞迴),第三種為迭代方法;迭代方法仍舊是利用stack模擬遞迴;

# 1.遞迴方法1

class solution

};

# 2.遞迴方法2

class solution

};

# 3. 迭代方法

class solution

return root;

}};

思路:利用前序遍歷為:[preroot, tree(preroot->left), tree(preroot->left)],中序遍歷為:[tree(inroot->left), inroot, tree(inroot->right)]的特性,設計遞迴函式mybuildtree(preorder, pre, end, il),其中il也就是中序遍歷中root的下標。其中不同方法:主要體現在根據根據preroot->val找其在中序遍歷的座標不同上,以下**是利用map來記錄座標的不同看**:

class solution     

return mybuildtree(preorder, 0, preorder.size() - 1, 0);

}private:

treenode* mybuildtree(vector& preorder, int pre, int end, int inl)

};

可能解:

遞迴求解的基本路子;

class solution 

};

思路:由於這類題有無限解,一定是遞迴回溯方法。設計函式_generate(int left, int right, int n, string str),因此需要考慮以下幾點:

終止條件terminator是:括號數量,left == right,則為符合條件的乙個;

遞迴條件:left < n, drill down,_generate(left + 1, right, n, str + '(')遞迴條件:left > right, drill down,_generate(left, right+1, n, str + ')')

class solution 

private:

void _generate(int left, int right, int n, string str)

if (left < n) _generate(left + 1, right, n, str + '(');

if (left > right) _generate(left, right + 1, n, str + ')');

}};

這個鏈結是關於stack和queue相關題目的集合——basic c++ iterative solution with detailed explanations. super easy for beginners.

極客時間-演算法訓練營-覃超

leetcode中文站

leetcode國際站 (將力扣中文鏈結,後面的-cn去掉,就是該題的國際站)

面試演算法題

前幾天,一好友去筆試,有一題 現在有1000個蘋果,和10個箱子,如何把這1000個蘋果裝在這10個箱子裡,才能使不管任何數量 1 1000 的蘋果,都能一次給出?當時,我們都想,出題這人。今天,在想移位的時候,突然想到了,這絕對是二進位制數的變種。分析 1000個蘋果,最接近1024,轉化為2進製...

面試演算法記錄

1.親和數問題 求500萬以內的所有親和數 如果兩個數a和b,a的所有真因數之和等於b,b的所有真因數之和等於a,則稱a,b是一對親和數。例如220和284,1184和1210,2620和2924。思路 220 1 2 4 71 142 sum 284 284 1 2 4 5 10 11 20 22...

面試演算法題目

看到一篇部落格,總結了各種鍊錶相關的問題,mark一下,感覺很不錯 戳我 程式設計之美 中 金剛坐飛機 問題 程式設計之美 中 瓷磚覆蓋地板 問題的擴充套件問題 程式設計之美 2.3 尋找發帖水王的擴充套件題目 尋找發帖量最多的三個id,他們發帖總數超過了帖子總數目n的1 4。參考 程式設計之美 2...