日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

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

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

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

一道LeetCode的多種解法

算法與數(shù)據(jù)結(jié)構(gòu) ? 來源:算法與數(shù)據(jù)結(jié)構(gòu) ? 2020-05-06 10:39 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

Leetcode 最新上線了手機(jī)版 APP,今天蹲坑的時(shí)候隨手翻了一道題,一道和棧有關(guān)的題目,大概知道了解題思路,就點(diǎn)開了題解準(zhǔn)備看看別人是如何寫代碼的,沒想到最后一種解法讓我感覺自己的智商受到了碾壓。

題目描述

給定一個(gè)只包含'('和')'的字符串,找出最長(zhǎng)的包含有效括號(hào)的子串的長(zhǎng)度。

示例 1:

輸入:"(()" 輸出:2 解釋:最長(zhǎng)有效括號(hào)子串為"()"

示例 2:

輸入:")()())" 輸出:4 解釋:最長(zhǎng)有效括號(hào)子串為"()()"

題目解析

解法一:棧

一開始看到這個(gè)題目,有點(diǎn)熟悉的感覺:相當(dāng)于是 LeetCode 第 20 題有效的括號(hào)的升級(jí)版。

想到這立馬嘗試借助棧這個(gè)數(shù)據(jù)結(jié)構(gòu)去解決。

括號(hào)相關(guān)的問題首先可以嘗試使用棧這個(gè)數(shù)據(jù)結(jié)構(gòu)去解決,至于原因,想一想應(yīng)該不難理解,如果進(jìn)來一個(gè)右括號(hào),也就是 ')',它會(huì)和之前最后一次遍歷到的左括號(hào)匹配,棧的先進(jìn)后出的特性保證了這一要求。

對(duì)于這道題目,因?yàn)槲覀円蟮氖亲哟拈L(zhǎng)度,因此我們可以考慮在棧中保存index,這樣子我們不僅可以通過index找到對(duì)應(yīng)的括號(hào),還可以借此來求長(zhǎng)度,我們的思路可以分為下面幾步:

1、從左到右遍歷輸入的字符串

2、如果遇到的是'(',意味著這并不能和前面遍歷過的部分組成合法答案,此時(shí)我們只需要把當(dāng)前index入棧即可

3、如果遇到的是')',這時(shí)我們就要看棧頂保存的元素了,這里就會(huì)有幾種情況:

棧頂保存的是'(',表示當(dāng)前元素和棧頂元素可以配對(duì),這個(gè)時(shí)候我們需要把棧頂元素彈出棧,記錄答案則記錄當(dāng)前index和彈出配對(duì)元素后的新棧頂index之間的距離,這個(gè)地方是重點(diǎn),如果不理解,你可以思考下面兩個(gè)例子:

"((()()" "((())"

棧頂保存的是')',如果是這種情況,表示前面沒有可配對(duì)的 '(',我們此時(shí)還是需要把當(dāng)前index入棧,原因是

我們確定距離需要知道邊界,如果不理解,還是有兩個(gè)例子供你參考:

"))(())" "())()()"

棧是空的,當(dāng)然在第一種情況中,你彈出棧頂元素后也會(huì)使得棧變空,為了避免這種情況,我們可以在最開始的時(shí)候推一個(gè)-1入棧,這樣可以節(jié)省我們的判斷次數(shù),并且當(dāng)棧中的沒有元素的時(shí)候,我們也可以用這個(gè)-1來計(jì)算當(dāng)前子串的長(zhǎng)度,你可以參考下面這兩個(gè)例子:

"()" "()(())"

代碼實(shí)現(xiàn)

publicintlongestValidParentheses(Strings){ if(s==null||s.length()==0){ return0; } intn=s.length(); char[]sArr=s.toCharArray(); Stackstack=newStack<>(); intresult=0; //-1入棧用于處理邊界條件 stack.push(-1); for(inti=0;i1表示棧不為空,而且我們必須保證棧頂元素是'(' if(sArr[i]==')'&&stack.size()>1&&sArr[stack.peek()]=='('){ //配對(duì)的'('出棧 stack.pop(); //記錄長(zhǎng)度 result=Math.max(result,i-stack.peek()); }else{//其他情況,直接將當(dāng)前位置入棧 stack.push(i); } } returnresult; }

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

如果用棧來解決的話,這道題思路差不多就是這樣??紤]到前不久一直聊動(dòng)態(tài)規(guī)劃,于是試了一下用把它歸納到序列型動(dòng)態(tài)規(guī)劃來求解。

動(dòng)態(tài)規(guī)劃之空間優(yōu)化與總結(jié)回顧

我們可以定義dp[i] 表示的是 str[0…i] 的答案,思路其實(shí)和前面很類似:

1、從左到右遍歷輸入的字符串

2、如果遇到的是 '(',意味著這并不能和前面遍歷過的部分組成合法答案,因?yàn)?dp 狀態(tài)數(shù)組中記錄的是答案,這個(gè)時(shí)候說明 dp[i] = 0,也就是不用做任何記錄

3、如果遇到的是 ')',這時(shí)我們還是需要往前看:

如果 str[i - 1] 是 '(',那么 dp[i] = dp[i - 2] + 2

如果 str[i - 1] 是 ')',這表示 str[i - 1] 已經(jīng)配對(duì)了,因此我們還要繼續(xù)往前看,從當(dāng)前位置往左,看第一個(gè)沒有被配對(duì)的 '(',怎么找這個(gè)位置呢,這里我們就可以利用 dp[i - 1] 這個(gè)信息,dp[i - 1] 表示的是之前匹配的長(zhǎng)度,那么 :

i - dp[i - 1] - 1表示的就是從當(dāng)前位置往左,第一個(gè)沒有被配對(duì)的位置

如果位置 i 和 位置 i - dp[i - 1] - 1 配對(duì)后,我們可以看看當(dāng)前的序列是否可以和之前匹配的序列鏈接起來,也就是加上 dp[i - dp[i - 1] - 2]

代碼實(shí)現(xiàn)

publicintlongestValidParentheses(Strings){ if(s==null||s.length()==0){ return0; } intn=s.length(); char[]sArr=s.toCharArray(); int[]dp=newint[n]; intresult=0; for(inti=1;i=2?dp[i-2]:0)+2; } //前一個(gè)位置是')' //我們從當(dāng)前位置往左看,如果第一個(gè)沒有被匹配的位置是'(' //表明當(dāng)前位置是可以被匹配的 elseif(i-dp[i-1]-1>=0&&sArr[i-dp[i-1]-1]=='('){ //這里其實(shí)是dp[i]=i-(i-dp[i-1]-1)+1=dp[i-1]+2 //但是我們還需要考慮之前的答案,也就是dp[i-dp[i-1]-2] //首先判斷i-dp[i-1]-2是否越界 //如果沒有越界就將其加上 dp[i]=dp[i-1]+2; if(i-dp[i-1]>=2){ dp[i]+=dp[i-dp[i-1]-2]; } } result=Math.max(result,dp[i]); } } returnresult; }

兩種方法時(shí)空復(fù)雜度都是 O(n),解法也有相似之處,只是說切題點(diǎn)不一樣。

正當(dāng)我美滋滋時(shí),突然看到另外一種解法,讓我感覺自己的智商受到了碾壓:不需要額外的空間,空間復(fù)雜度是 O(1)!

解法三:借助變量

使用了兩個(gè)變量 Left 和 Right,分別用來記錄到當(dāng)前位置時(shí)左括號(hào)和右括號(hào)的出現(xiàn)次數(shù)。

當(dāng)遇到左括號(hào)時(shí),Left 自增 1,右括號(hào)時(shí) Right 自增1。

對(duì)于最長(zhǎng)有效的括號(hào)的子串,一定是左括號(hào)等于右括號(hào)的情況,此時(shí)就可以更新結(jié)果 res 了,一旦右括號(hào)數(shù)量超過左括號(hào)數(shù)量了,說明當(dāng)前位置不能組成合法括號(hào)子串,Left 和 Right 重置為 0。

但是對(duì)于這種情況 "(()" 時(shí),在遍歷結(jié)束時(shí)左右子括號(hào)數(shù)都不相等,此時(shí)沒法更新結(jié)果 res,但其實(shí)正確答案是 2,怎么處理這種情況呢?

答案是再反向遍歷一遍,采取類似的機(jī)制,稍有不同的是此時(shí)若 Left 大于 Right 了,則重置 0,這樣就可以涵蓋所有情況。

代碼實(shí)現(xiàn)

//代碼來源:https://leetcode-cn.com/problems/longest-valid-parentheses/solution/zui-chang-you-xiao-gua-hao-by-leetcode/ publicclassSolution{ publicintlongestValidParentheses(Strings){ intleft=0,right=0,maxlength=0; for(inti=0;i=left){ left=right=0; } } left=right=0; for(inti=s.length()-1;i>=0;i--){ if(s.charAt(i)=='('){ left++; }else{ right++; } if(left==right){ maxlength=Math.max(maxlength,2*left); }elseif(left>=right){ left=right=0; } } returnmaxlength; } }

事實(shí)上,我在利用解法一求解完這道題目后還怡然自得,認(rèn)為這道題目最簡(jiǎn)單的解法就是借助棧這種數(shù)據(jù)結(jié)構(gòu),沒想到還有解法三這么巧妙的解法。。。

聲明:本文內(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)投訴

原文標(biāo)題:一道 LeetCode 的多種解法,打消了我的自以為是!

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

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    芯片的“第一道體檢”:文讀懂CP測(cè)試,半導(dǎo)體人必看!

    在芯片從晶圓到成品的漫長(zhǎng)旅程里,有一道看不見卻至關(guān)重要的關(guān)卡——CP測(cè)試。它被稱為芯片良率的“守門員”、封裝成本的“節(jié)流閥”,更是半導(dǎo)體產(chǎn)業(yè)鏈里前端制造與后端封測(cè)之間的關(guān)鍵樞紐。今天這篇,用通俗
    的頭像 發(fā)表于 04-17 10:03 ?503次閱讀
    芯片的“第<b class='flag-5'>一道</b>體檢”:<b class='flag-5'>一</b>文讀懂CP測(cè)試,半導(dǎo)體人必看!

    深入解析AD5737:款高性能四通電流輸出DAC

    深入解析AD5737:款高性能四通電流輸出DAC 在工業(yè)過程控制領(lǐng)域,精確的電流輸出對(duì)于系統(tǒng)的穩(wěn)定運(yùn)行至關(guān)重要。AD5737作為款四通電流輸出DAC,憑借其出色的性能和豐富的功
    的頭像 發(fā)表于 04-13 09:55 ?393次閱讀

    FT 測(cè)試:芯片出貨前的最后一道閘門

    在封裝流程里FT是個(gè)挺微妙的工序。它排在最后,卻經(jīng)常最先被懷疑:良率掉了→是不是FT卡嚴(yán)了?客訴來了→終測(cè)有沒有漏檢?批量異?!遣皇菧y(cè)試程序問題?但在產(chǎn)線待久了會(huì)慢慢明白句話:FT通常不是
    的頭像 發(fā)表于 03-27 10:02 ?244次閱讀
    FT 測(cè)試:芯片出貨前的最后<b class='flag-5'>一道</b>閘門

    EOL測(cè)試系統(tǒng)——電池包下線前的最后一道品質(zhì)防線

    在儲(chǔ)能電池包的生產(chǎn)線上,EOL測(cè)試系統(tǒng) 是產(chǎn)品交付前的最后一道關(guān)口,也是最重要的品質(zhì)防線。EOL測(cè)試的全面性與可靠性,直接決定了流入市場(chǎng)的儲(chǔ)能產(chǎn)品是否存在早期失效風(fēng)險(xiǎn)。 個(gè)完整的電池包EOL測(cè)試
    的頭像 發(fā)表于 03-23 16:40 ?416次閱讀
    EOL測(cè)試系統(tǒng)——電池包下線前的最后<b class='flag-5'>一道</b>品質(zhì)防線

    ??涤^瀾大模型助力公共安全領(lǐng)域效率提升

    海康觀瀾大模型再拓新場(chǎng)景,用科技為孩子的上學(xué)路筑起一道堅(jiān)實(shí)防線。
    的頭像 發(fā)表于 03-18 17:35 ?892次閱讀

    紅區(qū)破局之道:為什么防逆流裝置是“第一道防線”?

    當(dāng)之無愧的“第一道防線”。它不像四可裝置那樣兼具“可觀可測(cè)、可控可調(diào)”的全鏈條能力,卻能以最直接、最精準(zhǔn)的方式,守住紅區(qū)光伏并網(wǎng)的安全底線,為后續(xù)精細(xì)化管控、高效消納筑牢基礎(chǔ)——沒有這道防線,紅區(qū)光伏的合規(guī)運(yùn)營(yíng)、收益保障都將無從談起。
    的頭像 發(fā)表于 03-16 15:32 ?803次閱讀
    紅區(qū)破局之道:為什么防逆流裝置是“第<b class='flag-5'>一道</b>防線”?

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

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

    車載屏幕基礎(chǔ)可靠性功能測(cè)試:守護(hù)智能座艙的“第一道防線”

    車載屏幕的基礎(chǔ)可靠性功能測(cè)試,絕非簡(jiǎn)單的“點(diǎn)亮屏幕、點(diǎn)幾下看看”。它是個(gè)貫穿顯示、觸控、軟件、硬件、環(huán)境、安全等多領(lǐng)域的系統(tǒng)工程。每塊最終裝車的屏幕,其背后都是上述測(cè)試模塊成千上萬次嚴(yán)謹(jǐn)驗(yàn)證
    的頭像 發(fā)表于 12-04 09:59 ?2116次閱讀
    車載屏幕基礎(chǔ)可靠性功能測(cè)試:守護(hù)智能座艙的“第<b class='flag-5'>一道</b>防線”

    點(diǎn)焊機(jī)如何成為動(dòng)力電池安全的第一道防線?

    在動(dòng)力電池制造領(lǐng)域,電池點(diǎn)焊機(jī)的價(jià)值遠(yuǎn)不止于“連接”。它是在電池包這精密系統(tǒng)中,為電流構(gòu)建可靠通路、為結(jié)構(gòu)提供機(jī)械固持的核心裝備。其工作的成敗,直接錨定了整個(gè)電池包的安全性與使用壽命。 動(dòng)力電池包
    的頭像 發(fā)表于 11-27 09:55 ?595次閱讀

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

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

    施耐德電氣SmartCool助力金融行業(yè)數(shù)據(jù)中心節(jié)能降耗

    綠色數(shù)據(jù)中心的極致節(jié)能不是在和電費(fèi)較勁,而是在回答一道時(shí)代命題。
    的頭像 發(fā)表于 09-25 16:08 ?888次閱讀

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

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

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

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

    測(cè)試測(cè)量?jī)x器對(duì)SMA公頭的性能要求?

    對(duì)測(cè)試測(cè)量?jī)x器而言,SMA 公頭是 “數(shù)據(jù)入口”,性能直接決定結(jié)果可信度。德索從材料到工藝的全流程把控,讓每個(gè)公頭都成為精準(zhǔn)測(cè)量的第一道保障。選擇德索,就是給測(cè)試數(shù)據(jù)上了一道 “保險(xiǎn)栓”。
    的頭像 發(fā)表于 08-22 17:04 ?881次閱讀
    測(cè)試測(cè)量?jī)x器對(duì)SMA公頭的性能要求?

    聚徽制造業(yè)專屬工業(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è)專屬工業(yè)觸摸屏憑借其獨(dú)特的功能與技術(shù)優(yōu)勢(shì),深度融入生產(chǎn)的每一道工序,實(shí)現(xiàn)對(duì)生
    的頭像 發(fā)表于 05-16 15:50 ?878次閱讀
    永州市| 广东省| 伊宁市| 道孚县| 阳东县| 平陆县| 阿鲁科尔沁旗| 龙游县| 花莲县| 开远市| 客服| 罗山县| 永昌县| 辽宁省| 义马市| 唐河县| 永川市| 鹤岗市| 龙州县| 卢龙县| 莱州市| 大化| 通渭县| 喜德县| 峡江县| 浦城县| 改则县| 黑山县| 出国| 和田市| 环江| 洪江市| 黑河市| 图木舒克市| 甘谷县| 乌鲁木齐市| 上高县| 大渡口区| 印江| 杭锦旗| 三门县|