国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

詳解一道高頻算法題:括號生成

算法與數據結構 ? 來源:五分鐘學算法 ? 2020-06-03 17:19 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

題目描述

給出 n 代表生成括號的對數,請你寫出一個函數,使其能夠生成所有可能的并且有效的括號組合。

例如,給出 n = 3,生成結果為:

[ "((()))", "(()())", "(())()", "()(())", "()()()" ] 題目解析

方法一:回溯算法(深度優先遍歷)

如果完成一件事情有很多種方法,并且每一種方法分成若干步驟,那多半就可以使用“回溯”算法完成。

“回溯”算法的基本思想是“嘗試搜索”,一條路如果走不通(不能得到想要的結果),就回到上一個“路口”,嘗試走另一條路。

因此,“回溯”算法的時間復雜度一般不低。如果能提前分析出,走這一條路并不能得到想要的結果,可以跳過這個分支,這一步操作叫“剪枝”。

做“回溯”算法問題的基本套路是:

1、使用題目中給出的示例,畫樹形結構圖,以便分析出遞歸結構;

一般來說,樹形圖不用畫完,就能夠分析出遞歸結構和解題思路。

2、分析一個結點可以產生枝葉的條件、遞歸到哪里終止、是否可以剪枝、符合題意的結果在什么地方出現(可能在葉子結點,也可能在中間的結點);

3、完成以上兩步以后,就要編寫代碼實現上述分析的過程,使用代碼在畫出的樹形結構上搜索符合題意的結果。

在樹形結構上搜索結果集,使用的方法是執行一次“深度優先遍歷”。在遍歷的過程中,可能需要使用“狀態變量”。

(“廣度優先遍歷”當然也是可以的,請參考方法二。)

我們以 n = 2 為例,畫樹形結構圖。

題解配圖(1)

畫圖以后,可以分析出的結論:

左右都有可以使用的括號數量,即嚴格大于 0 的時候,才產生分支;

左邊不受右邊的限制,它只受自己的約束;

右邊除了自己的限制以外,還收到左邊的限制,即:右邊剩余可以使用的括號數量一定得在嚴格大于左邊剩余的數量的時候,才可以“節外生枝”;

在左邊和右邊剩余的括號數都等于 0 的時候結算。

參考代碼如下:

publicclassSolution{ publicListgenerateParenthesis(intn){ Listres=newArrayList<>(); //特判 if(n==0){ returnres; } //執行深度優先遍歷,搜索可能的結果 dfs("",n,n,res); returnres; } /** *@paramcurStr當前遞歸得到的結果 *@paramleft左括號還有幾個沒有用掉 *@paramright右邊的括號還有幾個沒有用掉 *@paramres結果集 */ privatevoiddfs(StringcurStr,intleft,intright,Listres){ //因為是遞歸函數,所以先寫遞歸終止條件 if(left==0&&right==0){ res.add(curStr); return; } //因為每一次嘗試,都使用新的字符串變量,所以沒有顯式的回溯過程 //在遞歸終止的時候,直接把它添加到結果集即可,與「力扣」第46題、第39題區分 //如果左邊還有剩余,繼續遞歸下去 if(left>0){ //拼接上一個左括號,并且剩余的左括號個數減1 dfs(curStr+"(",left-1,right,res); } //什么時候可以用右邊?例如,((((((),此時 left < right, ????????//?不能用等號,因為只有先拼了左括號,才能拼上右括號 ????????if?(right?>0&&left

如果我們不用減法,使用加法,即 left 表示“左括號還有幾個沒有用掉”,right 表示“右括號還有幾個沒有用掉”,可以畫出另一棵遞歸樹。

題解配圖(2)

參考代碼如下:

publicclassSolution{ //方法 2:用加法 publicListgenerateParenthesis(intn){ Listres=newArrayList<>(); //特判 if(n==0){ returnres; } //這里的dfs是隱式回溯 dfs("",0,0,n,res); returnres; } /** *@paramcurStr當前遞歸得到的結果 *@paramleft左括號用了幾個 *@paramright右括號用了幾個 *@paramn左括號、右括號一共用幾個 *@paramres結果集 */ privatevoiddfs(StringcurStr,intleft,intright,intn,Listres){ //因為是遞歸函數,所以先寫遞歸終止條件 if(left==n&&right==n){ res.add(curStr); return; } //如果左括號還沒湊夠,繼續湊 if(left right, //不能用等號,因為只有先拼了左括號,才能拼上右括號 if(rightright){ //拼接上一個右括號,并且剩余的右括號個數減1 dfs(curStr+")",left,right+1,n,res); } } }

方法二:廣度優先遍歷

還是上面的題解配圖(1),使用廣度優先遍歷,結果集都在最后一層,即葉子結點處得到所有的結果集,編寫代碼如下。

publicclassSolution{ classNode{ /** *當前得到的字符串 */ privateStringres; /** *剩余左括號數量 */ privateintleft; /** *剩余右括號數量 */ privateintright; publicNode(Stringres,intleft,intright){ this.res=res; this.left=left; this.right=right; } @Override publicStringtoString(){ return"Node{"+ "res='"+res+'''+ ",left="+left+ ",right="+right+ '}'; } } publicListgenerateParenthesis(intn){ Listres=newArrayList<>(); if(n==0){ returnres; } Queuequeue=newLinkedList<>(); queue.offer(newNode("",n,n)); //總共需要拼湊的字符總數是2*n n=2*n; while(n>0){ intsize=queue.size(); for(inti=0;i0){ queue.offer(newNode(curNode.res+"(",curNode.left-1,curNode.right)); } if(curNode.right>0&&curNode.left

方法三:動態規劃

第 1 步:定義狀態 dp[i]

使用 i 對括號能夠生成的組合。

注意:每一個狀態都是列表的形式。

第 2 步:狀態轉移方程:

i 對括號的一個組合,在 i - 1 對括號的基礎上得到;

i 對括號的一個組合,一定以左括號 "(" 開始(不一定以 ")" 結尾),為此,我們可以枚舉右括號 ")" 的位置,得到所有的組合;

枚舉的方式就是枚舉左括號 "(" 和右括號 ")" 中間可能的合法的括號對數,而剩下的合法的括號對數在與第一個左括號 "(" 配對的右括號 ")" 的后面,這就用到了以前的狀態。

狀態轉移方程是:

dp[i] = "(" + dp[可能的括號對數] + ")" + dp[剩下的括號對數]

“可能的括號對數” 與 “剩下的括號對數” 之和得為 i,故“可能的括號對數” j 可以從 0 開始,最多不能超過 i, 即 i - 1;

“剩下的括號對數” + j = i - 1,故 “剩下的括號對數” = i - j - 1。

整理得:

dp[i] = "(" + dp[j] + ")" + dp[i- j - 1] , j = 0, 1, ..., i - 1

第 3 步:思考初始狀態和輸出:

初始狀態:因為我們需要 0 對括號這種狀態,因此狀態數組 dp 從 0 開始,0 個括號當然就是 [""]。
輸出:dp[n] 。
這個方法暫且就叫它動態規劃,這么用也是很神奇的,它有下面兩個特點:

1、自底向上:從小規模問題開始,逐漸得到大規模問題的解集;

2、無后效性:后面的結果的得到,不會影響到前面的結果。

publicclassSolution{ //把結果集保存在動態規劃的數組里 publicListgenerateParenthesis(intn){ if(n==0){ returnnewArrayList<>(); } //這里dp數組我們把它變成列表的樣子,方便調用而已 List>dp=newArrayList<>(n); Listdp0=newArrayList<>(); dp0.add(""); dp.add(dp0); for(inti=1;i<=?n;?i++)?{ ????????????Listcur=newArrayList<>(); for(intj=0;jstr1=dp.get(j); Liststr2=dp.get(i-1-j); for(Strings1:str1){ for(Strings2:str2){ //枚舉右括號的位置 cur.add("("+s1+")"+s2); } } } dp.add(cur); } returndp.get(n); } }

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 算法
    +關注

    關注

    23

    文章

    4784

    瀏覽量

    98062
  • 遞歸
    +關注

    關注

    0

    文章

    29

    瀏覽量

    9296

原文標題:超詳細!詳解一道高頻算法題:括號生成

文章出處:【微信號:TheAlgorithm,微信公眾號:算法與數據結構】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    智慧礦山能耗監測新模式!投入減半,運維0成本!

    國家“雙碳”戰略的發條越擰越緊。對于礦山、化工、建材等高耗能行業來說,這不再是一道“加分”,而是一道“生死”。尤其是礦石選別環節,破碎、篩分、磨礦三大工序的電耗占比往往超過全廠的7
    的頭像 發表于 02-04 17:02 ?508次閱讀
    智慧礦山能耗監測新模式!投入減半,運維0成本!

    高頻芯片衰減器ATS系列:設計與應用詳解

    高頻芯片衰減器ATS系列:設計與應用詳解 在電子工程領域,高頻芯片衰減器是無線通信等系統中不可或缺的關鍵組件。今天,我們就來詳細探討下SSMSUSUMU的ATS系列
    的頭像 發表于 02-03 17:20 ?1091次閱讀

    高頻芯片衰減器 ATS 系列:設計與應用詳解

    高頻芯片衰減器 ATS 系列:設計與應用詳解高頻電子設計領域,芯片衰減器是不可或缺的關鍵組件。今天,我們就來詳細探討下 ATS 系列高頻
    的頭像 發表于 02-03 15:30 ?189次閱讀

    3秒響應、實時告警!智能井蓋如何成為城市安全的“第一道防線”?

    IP68防護、-40℃~80℃寬溫運行及10年超長續航,支持自定義報警閾值與多級告警機制,大幅降低誤報率。作為城市物聯網感知層的關鍵節點,智能井蓋已融入智慧城管與應急管理體系,成為守護市民腳下安全的“第一道防線”。
    的頭像 發表于 12-09 11:57 ?362次閱讀
    3秒響應、實時告警!智能井蓋如何成為城市安全的“第<b class='flag-5'>一道</b>防線”?

    openDACS 2025 開源EDA與芯片賽項 賽七:基于大模型的生成式原理圖設計

    領域,對促進產業高質量發展具有重要意義。本賽項包含7,下面是賽七 基于大模型的生成式原理圖設計的介紹。 2. 命題單位及賽Chai
    發表于 11-13 11:49

    不間斷電源(UPS):電力保障的“最后一道防線”

    (UninterruptiblePowerSupply,簡稱UPS)作為電力保障的“最后一道防線”,通過儲能裝置與智能轉換技術,在市電中斷時實現零切換時間供電,成為現代社會的“電力守護者”。、UP
    的頭像 發表于 10-29 09:02 ?1338次閱讀
    不間斷電源(UPS):電力保障的“最后<b class='flag-5'>一道</b>防線”

    【精選直播】openDACS 2025 開源EDA與芯片大賽 賽二 賽四 直播宣講會

    openDACS2025開源EDA與芯片大賽線上宣講賽二:TestBench生成與驗證10月31日(周五)19:30精彩開播|宣講信息報告題目賽宣講:TestBench生成與驗證宣
    的頭像 發表于 10-28 10:08 ?951次閱讀
    【精選直播】openDACS 2025 開源EDA與芯片大賽 賽<b class='flag-5'>題</b>二 賽<b class='flag-5'>題</b>四 直播宣講會

    電能質量在線監測裝置的高頻噪聲濾波功能有哪些參數可以配置?

    )動態調整,以實現 “精準濾除噪聲、完整保留有用信號” 的目標。以下是可配置的核心參數及其工程意義: 、硬件濾波參數(信號采集前端) 硬件濾波是高頻噪聲抑制的 “第一道防線”,其參數配置直接影響噪聲衰減能力與有用信號完整性。
    的頭像 發表于 10-15 16:43 ?551次閱讀

    數據濾波算法的具體實現步驟是怎樣的?

    高頻電磁、瞬時脈沖等),選擇適配的濾波算法并落地。以下以電能質量監測中最常用的 IIR 低通濾波(抗高頻干擾)、滑動平均濾波(抗瞬時脈沖)、卡爾曼濾波(抗動態波動) 為例,詳解具體實
    的頭像 發表于 10-10 16:45 ?820次閱讀

    鉛酸蓄電池在線監測:為關鍵基礎設施筑牢“最后一道防線”

    在數據中心、通信基站、軌道交通等關鍵應用場景中,蓄電池組往往是供電系統的“最后一道屏障”。旦蓄電池出現故障,可能導致系統斷電、數據丟失甚至設備損壞,帶來不可估量的經濟損失和安全風險。因此,對蓄電池
    的頭像 發表于 09-23 09:31 ?597次閱讀
    鉛酸蓄電池在線監測:為關鍵基礎設施筑牢“最后<b class='flag-5'>一道</b>防線”

    非對稱密鑰生成和轉換規格詳解

    Signature Algorithm),是種基于模算數和整數有限域離散對數難題的種公鑰密碼算法,常用于數字簽名和驗簽,不能用于加解密。 當前支持使用字符串參數和密鑰參數兩種方式生成
    發表于 09-01 07:50

    頂堅國產防爆手持終端如何成為石化企業安全生產的第一道防線

    頂堅國產防爆手持終端之所以能成為石化企業安全生產的第一道防線,源于其通過防爆設計、功能集成、實時交互與系統協同,從物理安全、功能安全、管理安全、應急安全等維度,覆蓋了安全生產的全流程(預防、監測
    的頭像 發表于 08-26 10:31 ?842次閱讀
    頂堅國產防爆手持終端如何成為石化企業安全生產的第<b class='flag-5'>一道</b>防線

    信號發生器如何與波束賦形算法配合優化?

    場景中的多徑傳播、干擾和用戶移動性,從而驗證和優化波束賦形算法的性能。以下是具體配合優化方法及實施步驟:、信號發生器在波束賦形優化中的核心作用 模擬多徑信道環境 功能:生成包含多徑時延、角度擴展
    發表于 08-08 14:41

    成品電池綜合測試儀:電池品質的最后一道把關人

    綜合測試儀便成為了電池生產線上的“最后一道把關人”,為電池品質保駕護航。 成品電池綜合測試儀的重要性 成品電池綜合測試儀,是種集多種測試功能于體的專業設備,能夠對電池進行全面的性能測試和評估。從電池的容量、
    的頭像 發表于 03-18 14:30 ?725次閱讀

    SVPWM的原理及法則推導和控制算法詳解

    ,而且使直流母線電壓的利用率有了很大提高,且更易于實現數字化。下面將對該算法進行詳細分析闡述。 文章過長,請點擊下方可查閱*附件:SVPWM的原理及法則推導和控制算法詳解.pdf
    發表于 03-14 14:51