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

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

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

3天內不再提示

一道LeetCode的多種解法

算法與數據結構 ? 來源:算法與數據結構 ? 2020-05-06 10:39 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

題目描述

給定一個只包含'('和')'的字符串,找出最長的包含有效括號的子串的長度。

示例 1:

輸入:"(()" 輸出:2 解釋:最長有效括號子串為"()"

示例 2:

輸入:")()())" 輸出:4 解釋:最長有效括號子串為"()()"

題目解析

解法一:棧

一開始看到這個題目,有點熟悉的感覺:相當于是 LeetCode 第 20 題有效的括號的升級版。

想到這立馬嘗試借助棧這個數據結構去解決。

括號相關的問題首先可以嘗試使用棧這個數據結構去解決,至于原因,想一想應該不難理解,如果進來一個右括號,也就是 ')',它會和之前最后一次遍歷到的左括號匹配,棧的先進后出的特性保證了這一要求。

對于這道題目,因為我們要求的是子串的長度,因此我們可以考慮在棧中保存index,這樣子我們不僅可以通過index找到對應的括號,還可以借此來求長度,我們的思路可以分為下面幾步:

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

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

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

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

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

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

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

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

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

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

代碼實現

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()]=='('){ //配對的'('出棧 stack.pop(); //記錄長度 result=Math.max(result,i-stack.peek()); }else{//其他情況,直接將當前位置入棧 stack.push(i); } } returnresult; }

解法二:動態規劃

如果用棧來解決的話,這道題思路差不多就是這樣。考慮到前不久一直聊動態規劃,于是試了一下用把它歸納到序列型動態規劃來求解。

動態規劃之空間優化與總結回顧

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

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

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

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

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

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

i - dp[i - 1] - 1表示的就是從當前位置往左,第一個沒有被配對的位置

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

代碼實現

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; } //前一個位置是')' //我們從當前位置往左看,如果第一個沒有被匹配的位置是'(' //表明當前位置是可以被匹配的 elseif(i-dp[i-1]-1>=0&&sArr[i-dp[i-1]-1]=='('){ //這里其實是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; }

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

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

解法三:借助變量

使用了兩個變量 Left 和 Right,分別用來記錄到當前位置時左括號和右括號的出現次數。

當遇到左括號時,Left 自增 1,右括號時 Right 自增1。

對于最長有效的括號的子串,一定是左括號等于右括號的情況,此時就可以更新結果 res 了,一旦右括號數量超過左括號數量了,說明當前位置不能組成合法括號子串,Left 和 Right 重置為 0。

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

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

代碼實現

//代碼來源: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; } }

事實上,我在利用解法一求解完這道題目后還怡然自得,認為這道題目最簡單的解法就是借助棧這種數據結構,沒想到還有解法三這么巧妙的解法。。。

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

    關注

    3

    文章

    573

    瀏覽量

    41584
  • leetcode
    +關注

    關注

    0

    文章

    20

    瀏覽量

    2544

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

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

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    操作系統的發展及分類

    批處理系統(多道程序設計技術出現以后)。   1) 單批處理系統   系統對作業的處理是成批進行的,但內存中始終保持一道作業。該系統是在解決人機矛盾和CPU與I/O設備速率不匹配的矛盾中形成
    發表于 01-15 08:00

    給燒錄工程師的 checklist:新批次芯片上線前的“三保險”

    分享我們車間總結的、可落地的新批次芯片上線檢查清單。第一道保險:來料確認(IQC環節)核對標簽與實物: 檢查料盤標簽上的完整型號、批次號(Lot Code)、日期碼。取樣讀取ID: 隨機抽取3-5顆
    發表于 12-30 14:00

    工序品質:后工序成敗的關鍵紐帶

    工序與后工序的品質關聯緊密,相互影響深遠,主要體現在以下幾個方面:尺寸精度方面在前工序中,如晶圓制造的前工序包括光刻、蝕刻等。光刻工序決定了電路圖案的精確位置和形狀,如果光刻
    的頭像 發表于 12-22 15:18 ?549次閱讀
    前<b class='flag-5'>道</b>工序品質:后<b class='flag-5'>道</b>工序成敗的關鍵紐帶

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

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

    車載屏幕基礎可靠性功能測試:守護智能座艙的“第一道防線”

    車載屏幕的基礎可靠性功能測試,絕非簡單的“點亮屏幕、點幾下看看”。它是個貫穿顯示、觸控、軟件、硬件、環境、安全等多領域的系統工程。每塊最終裝車的屏幕,其背后都是上述測試模塊成千上萬次嚴謹驗證
    的頭像 發表于 12-04 09:59 ?1791次閱讀
    車載屏幕基礎可靠性功能測試:守護智能座艙的“第<b class='flag-5'>一道</b>防線”

    點焊機如何成為動力電池安全的第一道防線?

    在動力電池制造領域,電池點焊機的價值遠不止于“連接”。它是在電池包這精密系統中,為電流構建可靠通路、為結構提供機械固持的核心裝備。其工作的成敗,直接錨定了整個電池包的安全性與使用壽命。 動力電池包
    的頭像 發表于 11-27 09:55 ?462次閱讀

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

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

    施耐德電氣SmartCool助力金融行業數據中心節能降耗

    綠色數據中心的極致節能不是在和電費較勁,而是在回答一道時代命題。
    的頭像 發表于 09-25 16:08 ?719次閱讀

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

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

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

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

    測試測量儀器對SMA公頭的性能要求?

    對測試測量儀器而言,SMA 公頭是 “數據入口”,性能直接決定結果可信度。德索從材料到工藝的全流程把控,讓每個公頭都成為精準測量的第一道保障。選擇德索,就是給測試數據上了一道 “保險栓”。
    的頭像 發表于 08-22 17:04 ?737次閱讀
    測試測量儀器對SMA公頭的性能要求?

    聚徽制造業專屬工業觸摸屏:精準控制每一道工序,提升生產精度

    在制造業競爭日益激烈的當下,產品質量與生產效率成為企業立足市場的關鍵,而生產精度則是保障產品質量的核心要素。制造業專屬工業觸摸屏憑借其獨特的功能與技術優勢,深度融入生產的每一道工序,實現對生
    的頭像 發表于 05-16 15:50 ?748次閱讀

    水文監測中的雙軌纜小車和鉛魚纜小車

    一道堅實的科技防線,那么這兩個設備有什么區別呢,原理又是怎么樣的呢?本文將探究竟。 ? ? ? ? 雙軌纜小車:通過兩根平行的軌道來引導小車的運行,利用電機或其他動力裝置驅動小車在軌道上移動,小車通常配備有滑輪或滾輪,與
    的頭像 發表于 04-11 15:15 ?984次閱讀
    水文監測中的雙軌纜<b class='flag-5'>道</b>小車和鉛魚纜<b class='flag-5'>道</b>小車

    空壓機超溫保護給設備加一道屏障

    空壓機
    jf_68343993
    發布于 :2025年04月08日 16:57:29

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

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