力扣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 ...