leetcode 22/300 括號生成 py
阿新 • • 發佈:2021-11-11
目錄
1 題目說明
2 方法一:遞迴建樹,雖然易懂但是不好寫
class Solution: def generateParenthesis(self, n: int) -> List[str]: if n <= 0: return [] res = [] #深度優先建樹,du'qi def dfs(paths, left, right): if left > n or right > left: return #left和right分別代表左右括號的數量,因此對數量超過n或者對數不匹配的進行去除 if len(paths) == n * 2: # 因為括號都是成對出現的,推出遞迴的條件 res.append(paths) return dfs(paths + '(', left + 1, right) # 生成一個就加一個 dfs(paths + ')', left, right + 1) dfs('', 0, 0) return res
3 方法二:
class Solution: def generateParenthesis(self, n: int) -> List[str]: if n == 0: return [] total_l = [] total_l.append([None]) # 0組括號時記為None total_l.append(["()"]) # 1組括號只有一種情況 for i in range(2,n+1): # 開始計算i組括號時的括號組合 l = [] for j in range(i): # 開始遍歷 p q (p為在內部的,q是在外部的詳看下面連線),其中p+q=i-1 , j 作為索引 now_list1 = total_l[j] # p = j 時的括號組合情況 now_list2 = total_l[i-1-j] # q = (i-1) - j 時的括號組合情況 for k1 in now_list1: for k2 in now_list2: if k1 == None: k1 = "" if k2 == None: k2 = "" el = "(" + k1 + ")" + k2 l.append(el) # 把所有可能的情況新增到 l 中 total_l.append(l) # l這個list就是i組括號的所有情況,新增到total_l中,繼續求解i=i+1的情況 return total_l[n] ''' 作者:yuyu-13 連結:https://leetcode-cn.com/problems/generate-parentheses/solution/zui-jian-dan-yi-dong-de-dong-tai-gui-hua-bu-lun-da/ 來源:力扣(LeetCode) 著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。 '''
簡單來說,在求N個括號的排列組合時,把第N種情況(也就是N個括號排列組合)視為單獨拿一個括號E出來,剩下的N-1個括號分為兩部分,P個括號和Q個括號,P+Q=N-1,然後這兩部分分別處於括號E內和括號E的右邊,各自進行括號的排列組合。由於我們是一步步計算得到N個括號的情況的,所以小於等於N-1個括號的排列組合方式我們是已知的(用合適的資料結構儲存,方便後續呼叫,且在儲存時可利用特定資料結構實現題目某些要求,如排序,去重等),且P+Q=N-1,P和Q是小於等於N-1的,所以我們能直接得到P個和Q個括號的情況,進而得到N個括號的結果!
樓主的演算法思想很巧妙,贊一個~這個演算法主要的基點就是將排列組合的情況分為了括號內和括號外這兩種情況,且僅存在兩種情況!至於為什麼,原因在於樓主的演算法的前提是單獨拿出來的括號E的左邊在N個括號所有排列組合情況中都是處於最左邊,所以不存在括號位於括號E的左邊的情況。因此,N-1個括號(拿出了括號E)僅可能分佈於括號E內和括號E外,分為兩種子情況討論! 這種思想還可以應用於其他類似的題的求解中,即怎樣合理高效的利用前面步驟的計算結果得出當前步驟結果,從而得出最終結果。
本文來自部落格園,作者:xingye_z,轉載請註明原文連結:https://www.cnblogs.com/xyzhrrr/p/15541665.html