chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀(guān)看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

詳解一道高頻算法題:括號(hào)生成

算法與數(shù)據(jù)結(jié)構(gòu) ? 來(lái)源:五分鐘學(xué)算法 ? 2020-06-03 17:19 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

題目描述

給出 n 代表生成括號(hào)的對(duì)數(shù),請(qǐng)你寫(xiě)出一個(gè)函數(shù),使其能夠生成所有可能的并且有效的括號(hào)組合。

例如,給出 n = 3,生成結(jié)果為:

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

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

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

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

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

做“回溯”算法問(wèn)題的基本套路是:

1、使用題目中給出的示例,畫(huà)樹(shù)形結(jié)構(gòu)圖,以便分析出遞歸結(jié)構(gòu);

一般來(lái)說(shuō),樹(shù)形圖不用畫(huà)完,就能夠分析出遞歸結(jié)構(gòu)和解題思路。

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

3、完成以上兩步以后,就要編寫(xiě)代碼實(shí)現(xiàn)上述分析的過(guò)程,使用代碼在畫(huà)出的樹(shù)形結(jié)構(gòu)上搜索符合題意的結(jié)果。

在樹(shù)形結(jié)構(gòu)上搜索結(jié)果集,使用的方法是執(zhí)行一次“深度優(yōu)先遍歷”。在遍歷的過(guò)程中,可能需要使用“狀態(tài)變量”。

(“廣度優(yōu)先遍歷”當(dāng)然也是可以的,請(qǐng)參考方法二。)

我們以 n = 2 為例,畫(huà)樹(shù)形結(jié)構(gòu)圖。

題解配圖(1)

畫(huà)圖以后,可以分析出的結(jié)論:

左右都有可以使用的括號(hào)數(shù)量,即嚴(yán)格大于 0 的時(shí)候,才產(chǎn)生分支;

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

右邊除了自己的限制以外,還收到左邊的限制,即:右邊剩余可以使用的括號(hào)數(shù)量一定得在嚴(yán)格大于左邊剩余的數(shù)量的時(shí)候,才可以“節(jié)外生枝”;

在左邊和右邊剩余的括號(hào)數(shù)都等于 0 的時(shí)候結(jié)算。

參考代碼如下:

publicclassSolution{ publicListgenerateParenthesis(intn){ Listres=newArrayList<>(); //特判 if(n==0){ returnres; } //執(zhí)行深度優(yōu)先遍歷,搜索可能的結(jié)果 dfs("",n,n,res); returnres; } /** *@paramcurStr當(dāng)前遞歸得到的結(jié)果 *@paramleft左括號(hào)還有幾個(gè)沒(méi)有用掉 *@paramright右邊的括號(hào)還有幾個(gè)沒(méi)有用掉 *@paramres結(jié)果集 */ privatevoiddfs(StringcurStr,intleft,intright,Listres){ //因?yàn)槭沁f歸函數(shù),所以先寫(xiě)遞歸終止條件 if(left==0&&right==0){ res.add(curStr); return; } //因?yàn)槊恳淮螄L試,都使用新的字符串變量,所以沒(méi)有顯式的回溯過(guò)程 //在遞歸終止的時(shí)候,直接把它添加到結(jié)果集即可,與「力扣」第46題、第39題區(qū)分 //如果左邊還有剩余,繼續(xù)遞歸下去 if(left>0){ //拼接上一個(gè)左括號(hào),并且剩余的左括號(hào)個(gè)數(shù)減1 dfs(curStr+"(",left-1,right,res); } //什么時(shí)候可以用右邊?例如,((((((),此時(shí) left < right, ????????//?不能用等號(hào),因?yàn)橹挥邢绕戳俗罄ㄌ?hào),才能拼上右括號(hào) ????????if?(right?>0&&left

如果我們不用減法,使用加法,即 left 表示“左括號(hào)還有幾個(gè)沒(méi)有用掉”,right 表示“右括號(hào)還有幾個(gè)沒(méi)有用掉”,可以畫(huà)出另一棵遞歸樹(shù)。

題解配圖(2)

參考代碼如下:

publicclassSolution{ //方法 2:用加法 publicListgenerateParenthesis(intn){ Listres=newArrayList<>(); //特判 if(n==0){ returnres; } //這里的dfs是隱式回溯 dfs("",0,0,n,res); returnres; } /** *@paramcurStr當(dāng)前遞歸得到的結(jié)果 *@paramleft左括號(hào)用了幾個(gè) *@paramright右括號(hào)用了幾個(gè) *@paramn左括號(hào)、右括號(hào)一共用幾個(gè) *@paramres結(jié)果集 */ privatevoiddfs(StringcurStr,intleft,intright,intn,Listres){ //因?yàn)槭沁f歸函數(shù),所以先寫(xiě)遞歸終止條件 if(left==n&&right==n){ res.add(curStr); return; } //如果左括號(hào)還沒(méi)湊夠,繼續(xù)湊 if(left right, //不能用等號(hào),因?yàn)橹挥邢绕戳俗罄ㄌ?hào),才能拼上右括號(hào) if(rightright){ //拼接上一個(gè)右括號(hào),并且剩余的右括號(hào)個(gè)數(shù)減1 dfs(curStr+")",left,right+1,n,res); } } }

方法二:廣度優(yōu)先遍歷

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

publicclassSolution{ classNode{ /** *當(dāng)前得到的字符串 */ privateStringres; /** *剩余左括號(hào)數(shù)量 */ privateintleft; /** *剩余右括號(hào)數(shù)量 */ 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)); //總共需要拼湊的字符總數(shù)是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

方法三:動(dòng)態(tài)規(guī)劃

第 1 步:定義狀態(tài) dp[i]

使用 i 對(duì)括號(hào)能夠生成的組合。

注意:每一個(gè)狀態(tài)都是列表的形式。

第 2 步:狀態(tài)轉(zhuǎn)移方程:

i 對(duì)括號(hào)的一個(gè)組合,在 i - 1 對(duì)括號(hào)的基礎(chǔ)上得到;

i 對(duì)括號(hào)的一個(gè)組合,一定以左括號(hào) "(" 開(kāi)始(不一定以 ")" 結(jié)尾),為此,我們可以枚舉右括號(hào) ")" 的位置,得到所有的組合;

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

狀態(tài)轉(zhuǎn)移方程是:

dp[i] = "(" + dp[可能的括號(hào)對(duì)數(shù)] + ")" + dp[剩下的括號(hào)對(duì)數(shù)]

“可能的括號(hào)對(duì)數(shù)” 與 “剩下的括號(hào)對(duì)數(shù)” 之和得為 i,故“可能的括號(hào)對(duì)數(shù)” j 可以從 0 開(kāi)始,最多不能超過(guò) i, 即 i - 1;

“剩下的括號(hào)對(duì)數(shù)” + j = i - 1,故 “剩下的括號(hào)對(duì)數(shù)” = i - j - 1。

整理得:

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

第 3 步:思考初始狀態(tài)和輸出:

初始狀態(tài):因?yàn)槲覀冃枰?0 對(duì)括號(hào)這種狀態(tài),因此狀態(tài)數(shù)組 dp 從 0 開(kāi)始,0 個(gè)括號(hào)當(dāng)然就是 [""]。
輸出:dp[n] 。
這個(gè)方法暫且就叫它動(dòng)態(tài)規(guī)劃,這么用也是很神奇的,它有下面兩個(gè)特點(diǎn):

1、自底向上:從小規(guī)模問(wèn)題開(kāi)始,逐漸得到大規(guī)模問(wèn)題的解集;

2、無(wú)后效性:后面的結(jié)果的得到,不會(huì)影響到前面的結(jié)果。

publicclassSolution{ //把結(jié)果集保存在動(dòng)態(tài)規(guī)劃的數(shù)組里 publicListgenerateParenthesis(intn){ if(n==0){ returnnewArrayList<>(); } //這里dp數(shù)組我們把它變成列表的樣子,方便調(diào)用而已 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){ //枚舉右括號(hào)的位置 cur.add("("+s1+")"+s2); } } } dp.add(cur); } returndp.get(n); } }

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀(guān)點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 算法
    +關(guān)注

    關(guān)注

    23

    文章

    4759

    瀏覽量

    97098
  • 遞歸
    +關(guān)注

    關(guān)注

    0

    文章

    29

    瀏覽量

    9262

原文標(biāo)題:超詳細(xì)!詳解一道高頻算法題:括號(hào)生成

文章出處:【微信號(hào):TheAlgorithm,微信公眾號(hào):算法與數(shù)據(jù)結(jié)構(gòu)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    openDACS 2025 開(kāi)源EDA與芯片賽項(xiàng) 賽七:基于大模型的生成式原理圖設(shè)計(jì)

    領(lǐng)域,對(duì)促進(jìn)產(chǎn)業(yè)高質(zhì)量發(fā)展具有重要意義。本賽項(xiàng)包含7,下面是賽七 基于大模型的生成式原理圖設(shè)計(jì)的介紹。 2. 命題單位及賽Chai
    發(fā)表于 11-13 11:49

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

    (UninterruptiblePowerSupply,簡(jiǎn)稱(chēng)UPS)作為電力保障的“最后一道防線(xiàn)”,通過(guò)儲(chǔ)能裝置與智能轉(zhuǎn)換技術(shù),在市電中斷時(shí)實(shí)現(xiàn)零切換時(shí)間供電,成為現(xiàn)代社會(huì)的“電力守護(hù)者”。、UP
    的頭像 發(fā)表于 10-29 09:02 ?345次閱讀
    不間斷電源(UPS):電力保障的“最后<b class='flag-5'>一道</b>防線(xiàn)”

    【精選直播】openDACS 2025 開(kāi)源EDA與芯片大賽 賽二 賽四 直播宣講會(huì)

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

    電能質(zhì)量在線(xiàn)監(jiān)測(cè)裝置的高頻噪聲濾波功能有哪些參數(shù)可以配置?

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

    數(shù)據(jù)濾波算法的具體實(shí)現(xiàn)步驟是怎樣的?

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

    鉛酸蓄電池在線(xiàn)監(jiān)測(cè):為關(guān)鍵基礎(chǔ)設(shè)施筑牢“最后一道防線(xiàn)”

    在數(shù)據(jù)中心、通信基站、軌道交通等關(guān)鍵應(yīng)用場(chǎng)景中,蓄電池組往往是供電系統(tǒng)的“最后一道屏障”。旦蓄電池出現(xiàn)故障,可能導(dǎo)致系統(tǒng)斷電、數(shù)據(jù)丟失甚至設(shè)備損壞,帶來(lái)不可估量的經(jīng)濟(jì)損失和安全風(fēng)險(xiǎn)。因此,對(duì)蓄電池
    的頭像 發(fā)表于 09-23 09:31 ?353次閱讀
    鉛酸蓄電池在線(xiàn)監(jiān)測(cè):為關(guān)鍵基礎(chǔ)設(shè)施筑牢“最后<b class='flag-5'>一道</b>防線(xiàn)”

    小紅書(shū):通過(guò)商品標(biāo)簽API自動(dòng)生成內(nèi)容標(biāo)簽,優(yōu)化社區(qū)推薦算法

    推薦系統(tǒng)的準(zhǔn)確性和用戶(hù)體驗(yàn)。整個(gè)過(guò)程結(jié)構(gòu)清晰,分為三個(gè)步驟:API集成、標(biāo)簽自動(dòng)生成算法優(yōu)化。 第步:商品標(biāo)簽API的集成與數(shù)據(jù)獲取 小紅書(shū)通過(guò)開(kāi)放API接口,實(shí)時(shí)獲取商品的結(jié)構(gòu)化標(biāo)簽數(shù)據(jù)。這些標(biāo)簽包括品類(lèi)(如“美妝”或“服
    的頭像 發(fā)表于 09-10 16:46 ?681次閱讀
    小紅書(shū):通過(guò)商品標(biāo)簽API自動(dòng)<b class='flag-5'>生成</b>內(nèi)容標(biāo)簽,優(yōu)化社區(qū)推薦<b class='flag-5'>算法</b>

    非對(duì)稱(chēng)密鑰生成和轉(zhuǎn)換規(guī)格詳解

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

    頂堅(jiān)國(guó)產(chǎn)防爆手持終端如何成為石化企業(yè)安全生產(chǎn)的第一道防線(xiàn)

    頂堅(jiān)國(guó)產(chǎn)防爆手持終端之所以能成為石化企業(yè)安全生產(chǎn)的第一道防線(xiàn),源于其通過(guò)防爆設(shè)計(jì)、功能集成、實(shí)時(shí)交互與系統(tǒng)協(xié)同,從物理安全、功能安全、管理安全、應(yīng)急安全等維度,覆蓋了安全生產(chǎn)的全流程(預(yù)防、監(jiān)測(cè)
    的頭像 發(fā)表于 08-26 10:31 ?604次閱讀
    頂堅(jiān)國(guó)產(chǎn)防爆手持終端如何成為石化企業(yè)安全生產(chǎn)的第<b class='flag-5'>一道</b>防線(xiàn)

    信號(hào)發(fā)生器如何與波束賦形算法配合優(yōu)化?

    場(chǎng)景中的多徑傳播、干擾和用戶(hù)移動(dòng)性,從而驗(yàn)證和優(yōu)化波束賦形算法的性能。以下是具體配合優(yōu)化方法及實(shí)施步驟:、信號(hào)發(fā)生器在波束賦形優(yōu)化中的核心作用 模擬多徑信道環(huán)境 功能:生成包含多徑時(shí)延、角度擴(kuò)展
    發(fā)表于 08-08 14:41

    聚徽制造業(yè)專(zhuān)屬工業(yè)觸摸屏:精準(zhǔn)控制每一道工序,提升生產(chǎn)精度

    在制造業(yè)競(jìng)爭(zhēng)日益激烈的當(dāng)下,產(chǎn)品質(zhì)量與生產(chǎn)效率成為企業(yè)立足市場(chǎng)的關(guān)鍵,而生產(chǎn)精度則是保障產(chǎn)品質(zhì)量的核心要素。制造業(yè)專(zhuān)屬工業(yè)觸摸屏憑借其獨(dú)特的功能與技術(shù)優(yōu)勢(shì),深度融入生產(chǎn)的每一道工序,實(shí)現(xiàn)對(duì)生
    的頭像 發(fā)表于 05-16 15:50 ?546次閱讀

    高頻四通RFID讀寫(xiě)器在倉(cāng)儲(chǔ)物流中的應(yīng)用

    高頻四通RFID讀寫(xiě)器憑借其卓越的性能優(yōu)勢(shì),正在深刻改變傳統(tǒng)倉(cāng)儲(chǔ)物流的管理模式,四通讀寫(xiě)器通過(guò)多通道協(xié)同工作和大規(guī)模標(biāo)簽批量讀取能力,為倉(cāng)儲(chǔ)物流管理帶來(lái)了革命性的效率提升和成本優(yōu)化。
    的頭像 發(fā)表于 04-27 16:48 ?569次閱讀

    成品電池綜合測(cè)試儀:電池品質(zhì)的最后一道把關(guān)人

    綜合測(cè)試儀便成為了電池生產(chǎn)線(xiàn)上的“最后一道把關(guān)人”,為電池品質(zhì)保駕護(hù)航。 成品電池綜合測(cè)試儀的重要性 成品電池綜合測(cè)試儀,是種集多種測(cè)試功能于體的專(zhuān)業(yè)設(shè)備,能夠?qū)﹄姵剡M(jìn)行全面的性能測(cè)試和評(píng)估。從電池的容量、
    的頭像 發(fā)表于 03-18 14:30 ?546次閱讀

    SVPWM的原理及法則推導(dǎo)和控制算法詳解

    ,而且使直流母線(xiàn)電壓的利用率有了很大提高,且更易于實(shí)現(xiàn)數(shù)字化。下面將對(duì)該算法進(jìn)行詳細(xì)分析闡述。 文章過(guò)長(zhǎng),請(qǐng)點(diǎn)擊下方可查閱*附件:SVPWM的原理及法則推導(dǎo)和控制算法詳解.pdf
    發(fā)表于 03-14 14:51

    富士通如何解鎖生成式AI紅利 從人才進(jìn)化到業(yè)務(wù)賦能

    正面臨一道必答題:您準(zhǔn)備好駕馭這場(chǎng)生產(chǎn)力革命了嗎? 生成式AI有望帶來(lái)巨大的經(jīng)濟(jì)價(jià)值。然而現(xiàn)實(shí)當(dāng)中,許多企業(yè)陷入“工具先行,人才掉隊(duì)”的困境,采購(gòu)最貴的AI系統(tǒng),卻因不會(huì)提問(wèn)、不懂調(diào)參、不敢創(chuàng)新,讓技術(shù)投資淪為昂貴的擺設(shè)。 這
    的頭像 發(fā)表于 02-25 17:32 ?1068次閱讀