力扣22 括號生成(動態規劃)

2021-10-20 22:57:41 字數 1109 閱讀 4733

力扣22. 括號生成(動態規劃)

數字 n 代表生成括號的對數,請你設計乙個函式,用於能夠生成所有可能的並且 有效的 括號組合。

示例 1:

輸入:n = 3

輸出:["((()))","(()())","(())()","()(())","()()()"]

示例 2:

輸入:n = 1

輸出:["()"]

1 <= n <= 8

反思:首先,面向小白:什麼是動態規劃?在此題中,動態規劃的思想類似於數學歸納法,當知道所有 i當我們清楚所有 i那麼,剩下 n-1 組括號有可能在哪呢?

【這裡是重點,請著重理解】

剩下的括號要麼在這一組新增的括號內部,要麼在這一組新增括號的外部(右側)。

既然知道了 i"(" + 【i=p時所有括號的排列組合】 + ")" + 【i=q時所有括號的排列組合】

其中 p + q = n-1,且 p q 均為非負整數。

事實上,當上述 p 從 0 取到 n-1,q 從 n-1 取到 0 後,所有情況就遍歷完了。

注:上述遍歷是沒有重複情況出現的,即當 (p1,q1)≠(p2,q2) 時,按上述方式取的括號組合一定不同。

第乙個迴圈i是動態規劃向下求解

第二個迴圈j是得到dp[i]之前(dp[0]----dp[i-1])的全部組合情況,作為索引

第三個迴圈p是得到dp[j]的全部組合情況

第四個迴圈q是得到dp[i-j-1]的全部組合情況

#include #includeusing namespace std;

class solution ;

if (n == 1)return ;

vector>dp(n+1);//二維陣列dp[n]代表括號對數時的有效組合

dp[0] = ;//初始化條件

dp[1] = ;//初始化條件

for (int i = 2; i <= n; i++)//開始計算i組括號時的括號組合}}

}return dp[n];

}};int main()

cout << endl;

std::cout << "hello world!\n";

}

力扣 22括號生成

22.括號生成 難度中等942收藏分享切換為英文關注反饋 數字 n 代表生成括號的對數,請你設計乙個函式,用於能夠生成所有可能的並且有效的括號組合。示例 輸入 n 3輸出 思路 我想的是先把所有情況弄出來,然後再刪選出合適的,缺點 複雜度很高 怎麼把左右情況弄出來 用遞迴,你的字元除了 之外就是 所...

動態規劃 力扣542 01矩陣

給定乙個由 0 和 1 組成的矩陣 mat 請輸出乙個大小相同的矩陣,其中每乙個格仔是 mat 中對應位置元素到最近的 0 的距離。兩個相鄰元素間的距離為 1 示例 輸入 mat 0,0,0 0,1,0 0,0,0 輸出 0,0,0 0,1,0 0,0,0 一般來說,因為這道題涉及到四個方向上的最近...

22 括號生成

參考回溯法 1.class solution def init self self.ans list defgenerateparenthesis self,n int self.parenthesisiter n,0,return self.ans list defparenthesisiter ...