色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

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

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

算法與數(shù)據(jù)結(jié)構(gòu) ? 來源:五分鐘學(xué)算法 ? 2020-06-03 17:19 ? 次閱讀

題目描述

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

題解配圖(1)

畫圖以后,可以分析出的結(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è)沒有用掉 *@paramright右邊的括號(hào)還有幾個(gè)沒有用掉 *@paramres結(jié)果集 */ privatevoiddfs(StringcurStr,intleft,intright,Listres){ //因?yàn)槭沁f歸函數(shù),所以先寫遞歸終止條件 if(left==0&&right==0){ res.add(curStr); return; } //因?yàn)槊恳淮螄L試,都使用新的字符串變量,所以沒有顯式的回溯過程 //在遞歸終止的時(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è)沒有用掉”,right 表示“右括號(hào)還有幾個(gè)沒有用掉”,可以畫出另一棵遞歸樹。

題解配圖(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ù),所以先寫遞歸終止條件 if(left==n&&right==n){ res.add(curStr); return; } //如果左括號(hào)還沒湊夠,繼續(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é)果集,編寫代碼如下。

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) "(" 開始(不一定以 ")" 結(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 開始,最多不能超過 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 開始,0 個(gè)括號(hào)當(dāng)然就是 [""]。
輸出:dp[n] 。
這個(gè)方法暫且就叫它動(dòng)態(tài)規(guī)劃,這么用也是很神奇的,它有下面兩個(gè)特點(diǎn):

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

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

    關(guān)注

    23

    文章

    4620

    瀏覽量

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

    關(guān)注

    0

    文章

    28

    瀏覽量

    9038

原文標(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)推薦

    硬件工程師面試常考的一道,講講運(yùn)算放大器的增益帶寬積

    Part 01 前言 想要學(xué)好運(yùn)算放大器電路,個(gè)繞不過的參數(shù)就是增益帶寬積,只有理解了增益帶寬積,才能真正理解運(yùn)算放大器電路的增益與帶寬的關(guān)系。什么是增益帶寬積呢?英文名字叫GBP或GBW
    的頭像 發(fā)表于 12-27 08:13 ?468次閱讀
    硬件工程師面試常考的<b class='flag-5'>一道</b><b class='flag-5'>題</b>,講講運(yùn)算放大器的增益帶寬積

    ADS1256 8通依次采樣,數(shù)據(jù)不正確怎么解決?

    SPI總線速度1.40625MB/S,基于STM32的HAL庫下,對(duì)八通輸入同一道方波,方波頻率20HZ、40HZ、60HZ時(shí),會(huì)出現(xiàn)只有部分通道采樣的數(shù)據(jù)能顯示波形,輸入其他頻率的方波時(shí),會(huì)存在采樣到的數(shù)據(jù)顯示的波形占空比與輸入方波的占空比不相同,這種情況是屬于寄存器
    發(fā)表于 11-22 07:09

    AIGC算法解析及其發(fā)展趨勢(shì)

    AIGC(Artificial Intelligence Generated Content,人工智能生成內(nèi)容)算法是當(dāng)今前沿科技的代表,它利用人工智能技術(shù)和算法自動(dòng)生成各種形式的內(nèi)容
    的頭像 發(fā)表于 10-25 15:35 ?469次閱讀

    IPV6報(bào)文怎么進(jìn)行通信

    寫這篇文章的啟發(fā)是在群里,看到個(gè)小兄弟說有嘗做一道IPV6的基礎(chǔ),看到該消息想著自己也沒啥事,就做下,弄個(gè)飯錢也還行,然后就開始了。
    的頭像 發(fā)表于 10-25 09:36 ?271次閱讀
    IPV6報(bào)文怎么進(jìn)行通信

    企業(yè)如何數(shù)字化轉(zhuǎn)型

    在當(dāng)今這個(gè)日新月異的數(shù)字時(shí)代,企業(yè)的數(shù)字化轉(zhuǎn)型已不再是一道選擇,而是一道必答題。它不僅關(guān)乎企業(yè)的生存與發(fā)展,更是決定企業(yè)能否在激烈的市場(chǎng)競(jìng)爭(zhēng)中脫穎而出的關(guān)鍵。 企業(yè)數(shù)字化轉(zhuǎn)型,簡(jiǎn)而言之,就是利用
    的頭像 發(fā)表于 08-27 16:55 ?414次閱讀

    好未來與微軟開展合作,攜手構(gòu)建智慧學(xué)習(xí)生態(tài)系統(tǒng)

    想象下,你正在解一道復(fù)雜的數(shù)學(xué)。這難度不小,你解題時(shí)遇到了瓶頸。這時(shí),位“老師”出現(xiàn)在你面前,不是直接給出答案,而是像蘇格拉底式教學(xué)
    的頭像 發(fā)表于 08-20 10:12 ?552次閱讀

    工商業(yè)儲(chǔ)能選型指南及參數(shù)詳解

    行業(yè)普遍認(rèn)為2023年是工商儲(chǔ)元年。如今,工商儲(chǔ)賽道仍然持續(xù)升溫中,無數(shù)新玩家涌入。但令人眼花繚亂的選型配置成為不少玩家的第一道門檻,今天小固就手把手帶你進(jìn)行工商儲(chǔ)選型,為你進(jìn)行核心參數(shù)詳解
    的頭像 發(fā)表于 08-05 14:52 ?2984次閱讀
    工商業(yè)儲(chǔ)能選型指南及參數(shù)<b class='flag-5'>詳解</b>

    Verilog testbench問題求助

    這是我在HDLbits網(wǎng)站上做到的一道,是testbench,請(qǐng)問這個(gè)代碼為什么input都是低電平0?我設(shè)置的時(shí)鐘就是周期10ns,占空比50%的時(shí)鐘信號(hào)啊?怎么會(huì)出現(xiàn)這種情況......
    發(fā)表于 07-21 11:14

    求助各位關(guān)于Verilog當(dāng)中模塊例化、端口與引腳 的問題

    ? 4.assign a = b 當(dāng)中的a和b都是信號(hào)?端口是不是不能寫在運(yùn)算式當(dāng)中? 5.同題組的題目當(dāng)中還有一道這個(gè): (1)這道題在寫的時(shí)候,就可以直接寫.in1(a),為什么?是因?yàn)閕n1是端口而a是信號(hào)
    發(fā)表于 07-15 20:38

    基于神經(jīng)網(wǎng)絡(luò)的全息圖生成算法

    全息圖生成技術(shù)作為光學(xué)與計(jì)算機(jī)科學(xué)交叉領(lǐng)域的重要研究方向,近年來隨著神經(jīng)網(wǎng)絡(luò)技術(shù)的飛速發(fā)展,取得了顯著進(jìn)展。基于神經(jīng)網(wǎng)絡(luò)的全息圖生成算法,以其強(qiáng)大的非線性擬合能力和高效的計(jì)算性能,為全息圖的生成
    的頭像 發(fā)表于 07-09 15:54 ?488次閱讀

    生成對(duì)抗網(wǎng)絡(luò)(GANs)的原理與應(yīng)用案例

    生成對(duì)抗網(wǎng)絡(luò)(Generative Adversarial Networks,GANs)是種由蒙特利爾大學(xué)的Ian Goodfellow等人在2014年提出的深度學(xué)習(xí)算法。GANs通過構(gòu)建兩個(gè)
    的頭像 發(fā)表于 07-09 11:34 ?1110次閱讀

    生成式AI的基本原理和應(yīng)用領(lǐng)域

    生成式人工智能(Generative Artificial Intelligence,簡(jiǎn)稱Generative AI)是種利用機(jī)器學(xué)習(xí)算法和深度學(xué)習(xí)技術(shù),通過模擬人類的創(chuàng)造性思維過程,生成
    的頭像 發(fā)表于 07-04 11:50 ?1548次閱讀

    機(jī)器學(xué)習(xí)算法原理詳解

    機(jī)器學(xué)習(xí)作為人工智能的個(gè)重要分支,其目標(biāo)是通過讓計(jì)算機(jī)自動(dòng)從數(shù)據(jù)中學(xué)習(xí)并改進(jìn)其性能,而無需進(jìn)行明確的編程。本文將深入解讀幾種常見的機(jī)器學(xué)習(xí)算法原理,包括線性回歸、邏輯回歸、支持向量機(jī)(SVM)、決策樹和K近鄰(KNN)算法,探
    的頭像 發(fā)表于 07-02 11:25 ?1134次閱讀

    BLDC電機(jī)控制算法詳解

    算法。本文將詳細(xì)介紹BLDC電機(jī)的控制算法,包括電速算法、電流環(huán)控制算法、磁場(chǎng)導(dǎo)向控制算法等,并探討其原理、特點(diǎn)和應(yīng)用。
    的頭像 發(fā)表于 06-14 10:49 ?1121次閱讀

    阿里云視頻生成技術(shù)創(chuàng)新!視頻生成使用了哪些AI技術(shù)和算法

    電子發(fā)燒友網(wǎng)報(bào)道(文/李彎彎)日前,阿里云宣布通義實(shí)驗(yàn)室研發(fā)的視頻生成模型EMO正式上線通義App,免費(fèi)對(duì)所有人開放。借助這功能,用戶可以在歌曲、熱梗、表情包中任選款模板,然后通過上傳
    的頭像 發(fā)表于 05-08 00:07 ?3394次閱讀
    主站蜘蛛池模板: 波多野结衣的AV一区二区三区| 美女议员被泄裸照| 花蝴蝶高清观看免费| 久久偷拍国2017的| 欧美整片华人play| 亚洲高清毛片一区二区| 87.6在线收听| 国产高清亚洲| 2022一本久道久久综合狂躁| 超碰在线视频 免费| 国产亚洲精品久久无亚洲| 国产亚洲精品黑人粗大精选| 久久亚洲AV无码精品午色夜麻豆| 日本一区精品久久久久影院| 日本久久黄色| 亚洲免费无码中文在线| 亚洲色综合中文字幕在线| BL全肉多攻NP高H| XXX国产麻豆HD真实乱| 52色擼99热99| 国产精品麻豆a在线播放| 国内精品乱码卡一卡2卡三卡新区| 黄色三级视频在线| 皮皮在线精品亚洲| 亚洲无码小格式| 动漫美女喷水| 老师我好爽再深一点老师好涨| 免费在线a| 亚洲国产精品嫩草影院永久 | 狠狠色综合久久婷婷| 久久91精品国产91久久户| 毛片手机在线| 亚洲AV无码乱码A片无码蜜桃| 99在线观看视频| 国产精品v片在线观看不卡| 麻1豆传媒2021精品| 亚洲精品成人在线| 法国剧丝袜情版h级在线电影| 黑吊大战白xxxxxx| 三级在线观看网站| 亚洲日产2020乱码草莓毕|