极客时间-算法训练营 3.2
一 序
?本文屬于極客時間-算法訓練營 學習筆記。
對應章節:極客時間-算法訓練營 學習筆記 3遞歸的實現、特性以及思維要點
二 70Climbing Stairs
You are climbing a stair case. It takes?n?steps to reach to the top.
Each time you can either climb 1 or 2 steps. In how many distinct ways can you climb to the top?
Note:?Given?n?will be a positive integer.
Example 1:
Input: 2
Output: 2
Explanation: There are two ways to climb to the top.
1. 1 step + 1 step
2. 2 steps
Example 2:
Input: 3
Output: 3
Explanation: There are three ways to climb to the top.
1. 1 step + 1 step + 1 step
2. 1 step + 2 steps
3. 2 steps + 1 step
這個題目,覃超老師沒有太多展開去講:
強調了一點,尋找規律。就是利用數學歸納法來找到題目隱藏的斐波那契數列。
設f(n)表示爬n階樓梯的不同方法數,進而分析出:
? ?f(n) = f(n-1)+f(n-2).
三種解法:
?只有遞歸:不過
1)使用遞歸+緩存。
2)使用數組,來實現動態規劃。
3) 直接利用函數公式(前提數學好)
感興趣的可以看看:https://blog.csdn.net/bohu83/article/details/102528611
三?22.?Generate Parentheses
Given?n?pairs of parentheses, write a function to generate all combinations of well-formed parentheses.
For example, given?n?= 3, a solution set is:
["((()))","(()())","(())()","()(())","()()()" ]這個題目,覃超老師親自示范了解題思路。
我記錄下:
1是讀題:生成N對匹配括號。列出所有可能。熟悉的同學可以直接跳過了。
切到IDE里面:
先不考慮合法匹配的問題,問題簡化成再2*N的長度填充括號。
套用了遞歸的模板:
public void recur(int level,int param){//遞歸終結條件if(level>MAX_LEVEL){return;}//處理當前層process(level,param);//下探到下一層recur(level:level+1,newParam);//清理當前層//reverse the current level status if needed }———————————————— 版權聲明:本文為CSDN博主「bohu83」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。 原文鏈接:https://blog.csdn.net/bohu83/article/details/107094970遞歸函數的參數:當前level,最大層數,當前字符串?
public class Code22 {public static void main(String[] args) {Code22 code = new Code22();code.generateParenthesis(3);}public List<String> generateParenthesis(int n) {generate(0,2*n,"");return null;}public void generate(int level,int max,String s){//終止if(level>=max){System.out.println(s);return;}// this levelString s1 = s+"(";String s2 =s+")";// next levelgenerate(level+1,max,s1);generate(level+1,max,s2);} }輸出結果:
(((((( ((((() (((()( (((()) ((()(( ((()() ((())( ((())) (()((( (()(() (()()( (()()) (())(( (())() (()))( (()))) ()(((( ()((() ()(()( ()(()) ()()(( ()()() ()())( ()())) ())((( ())(() ())()( ())()) ()))(( ()))() ())))( ())))) )((((( )(((() )((()( )((()) )(()(( )(()() )(())( )(())) )()((( )()(() )()()( )()()) )())(( )())() )()))( )()))) ))(((( ))((() ))(()( ))(()) ))()(( ))()() ))())( ))())) )))((( )))(() )))()( )))()) ))))(( ))))() )))))( ))))))再判斷括號是否合法 :
- ?左括號不能》n
- ?右括號 左括號個數》右括號的個數
這個兩個條件就能覆蓋了題目的要求。
因此,修改題目的遞歸函數,改為左括號數,右括號數、N,
public List<String> generateParenthesis(int n) {generate(0,0,n,"");return null;}public void generate(int left,int right,int n,String s){//終止if(left>=n && right>=left){System.out.println(s);return;}// this level// next levelif(left<n) {//左括號能添加generate(left + 1, right,n, s + "(");}if(left>right) {//右括號能添加generate(left ,right+1, n, s + ")");}}這里輸出的就是合法的了:
((()))
(()())
(())()
()(())
()()()
這里對比之前,就發現少了無效的結果,也就是使用邏輯判斷提前減去不合法的分支。所謂的”剪枝“。
當然,本地做完了,需要再LeetCode補充完代碼,輸出結果
所以關鍵的是:怎么梳理思路寫遞歸。怎么確定參數。
好了,講完這個例子,超哥有blabla說了一通實際生活中遞歸的應用,腦洞大開,吧黑客帝國的場景都搬出來了。
有沒有道家的一生二,二生三,三生萬物的感覺。
最后,強調關注下LeetCode國際站,
先看官方題解,再看most votes. 可以關注下自己的語言: 更容易理解。
養成一種習慣,就是喜歡看別人的代碼,要是簡潔易懂就好好學習,練會學會。沒幾行就實現了不是很好懂的,也算提升自己的代碼理解能力。怎么著都有好處。
超哥強調的這種悟道、有感覺就是這個意思。簡單來說,你知道去哪里學習別人的好代碼,也自我培養不斷練習學習的習慣,那肯定有收獲嘛。
如果不明白,就反復多看幾遍視頻。
?
四?98.?Validate Binary Search Tree
問題:
Given a binary tree, determine if it is a valid binary search tree (BST).
Assume a BST is defined as follows:
- The left subtree of a node contains only nodes with keys?less than?the node's key.
- The right subtree of a node contains only nodes with keys?greater than?the node's key.
- Both the left and right subtrees must also be binary search trees.
?
Example 1:
2/ \1 3Input:?[2,1,3] Output: trueExample 2:
5/ \1 4/ \3 6Input: [5,1,4,null,null,3,6] Output: false Explanation: The root node's value is 5 but its right child's value is 4.問題是校驗一顆樹是否是二叉搜索樹。
條件就是左子樹比根節點小,右子樹比根節點大。
常規思路會去套用遞歸。
遞歸的判斷的就是邊界。沒聽超哥講,做了半小時,各種翻車。
有一個容易陷入的誤區就是:之比較左節點右節點,而是要比較整個左子樹、右子樹。
就是這個常規思路就是參照定義:來確定遞歸的參數:當前節點以及最小、最大值。
左子樹范圍就是(min,當前節點val),右子樹范圍就是(當前節點val,max)
實際做的時候各種邊界問題:比如這個
[2147483647]
還是需要反復練習。
覃超老師,后來提到了利用二叉樹中序遍歷,結果是升序的。來驗證。
這個還沒做,待補充。
總結
以上是生活随笔為你收集整理的极客时间-算法训练营 3.2的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【vim】几种模式的切换
- 下一篇: c语言在函数中传递指针,[求助]关于文件