Go java 算法之括號生成示例詳解
括號生成
數(shù)字 n 代表生成括號的對數(shù),請你設(shè)計一個函數(shù),用于能夠生成所有可能的并且 有效的 括號組合。
- 示例 1:
輸入:n = 3
輸出:["((()))","(()())","(())()","()(())","()()()"]
- 示例 2:
輸入:n = 1
輸出:["()"]
提示:
1 <= n <= 8
方法一:深度優(yōu)先遍歷(java)
首先我們需要知道一個結(jié)論,一個合法的括號序列需要滿足兩個條件:
1、左右括號數(shù)量相等
2、任意前綴中左括號數(shù)量 >= 右括號數(shù)量 (也就是說每一個右括號總能找到相匹配的左括號)
題目要求我們生成n對的合法括號序列組合,因此可以考慮使用深度優(yōu)先搜索
將搜索順序定義為枚舉序列的每一位填什么,那么最終的答案一定是由n個左括號和n個右括號組成。
class Solution {
public List<String> generateParenthesis(int n) {
List<String> ans = new ArrayList<String>();
backtrack(ans, new StringBuilder(), 0, 0, n);
return ans;
}
public void backtrack(List<String> ans, StringBuilder cur, int open, int close, int max) {
if (cur.length() == max * 2) {
ans.add(cur.toString());
return;
}
if (open < max) {
cur.append('(');
backtrack(ans, cur, open + 1, close, max);
cur.deleteCharAt(cur.length() - 1);
}
if (close < open) {
cur.append(')');
backtrack(ans, cur, open, close + 1, max);
cur.deleteCharAt(cur.length() - 1);
}
}
}
時間復(fù)雜度:o(4^n / n^(1/2))
空間復(fù)雜度:o(n)
方法一:深度優(yōu)先遍歷(go)
具體方法分析已在上文中表述
根據(jù)題目條件生成一顆樹,并對這顆樹生枝葉的條件按照題目進行限制。
需要左右括號都大于0個時才可以進行生成樹的操作(等于0的特殊情況)
生成樹之后生出左節(jié)點的條件:左括號的剩余數(shù)量大于0
生成樹之后生成右節(jié)點條件:左括號的剩余數(shù)量 小于 右括號的剩余數(shù)量
當(dāng)左右括號都為0時,為成功出口,此時進行結(jié)算,保存結(jié)果。
var ans []string
var backtrack func([]byte, int, int)
backtrack = func(bytes []byte, left int, right int) {
if len(bytes) == 2*n {
ans = append(ans, string(bytes))
return
}
if left < n {
bytes = append(bytes,'(')
backtrack(bytes, left+1, right)
bytes = bytes[:len(bytes)-1]
}
if right < left{
bytes = append(bytes, ')')
backtrack(bytes, left, right + 1)
bytes = bytes[:len(bytes)-1]
}
}
var container []byte
backtrack(container, 0, 0)
return ans
時間復(fù)雜度:o(4^n / n^(1/2))
空間復(fù)雜度:o(n)
以上就是Go java 算法之括號生成示例詳解的詳細(xì)內(nèi)容,更多關(guān)于Go java 算法括號生成的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Go和Java算法詳析之分?jǐn)?shù)到小數(shù)
這篇文章主要給大家介紹了關(guān)于Go和Java算法詳析之分?jǐn)?shù)到小數(shù)的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2022-08-08
Golang微服務(wù)框架Kratos實現(xiàn)Kafka消息隊列的方法
消息隊列是大型分布式系統(tǒng)不可缺少的中間件,也是高并發(fā)系統(tǒng)的基石中間件,所以掌握好消息隊列MQ就變得極其重要,在本文當(dāng)中,您將了解到:什么是消息隊列?什么是Kafka?怎樣在微服務(wù)框架Kratos當(dāng)中應(yīng)用Kafka進行業(yè)務(wù)開發(fā),需要的朋友可以參考下2023-09-09
Go檢查結(jié)構(gòu)體中是否存在某個字段及創(chuàng)建結(jié)構(gòu)體切片或映射
這篇文章主要為大家介紹了Go檢查結(jié)構(gòu)體中是否存在某個字段及創(chuàng)建結(jié)構(gòu)體切片或映射實現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2024-01-01
Go處理json數(shù)據(jù)方法詳解(Marshal,UnMarshal)
這篇文章主要介紹了Go處理json數(shù)據(jù)的方法詳解,Marshal(),UnMarshal(),需要的朋友可以參考下2022-04-04

