日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

极客时间-算法训练营 3.2

發布時間:2023/12/10 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 极客时间-算法训练营 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: true

Example 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。