在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

    瀏覽量

    40244
  • leetcode
    +關注

    關注

    0

    文章

    20

    瀏覽量

    2348

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

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

收藏 人收藏

    評論

    相關推薦

    AMD攜多樣化產品組合亮相ISE 2025

    在 ISE 2025 上,AMD 將展示其多樣化產品組合,這些產品組合支持多種 AV-over-IP、連接和視頻處理應用,同時還支持基于 AI 的創新,以增強用戶體驗。我們將與主要合作伙伴一道,在巴塞羅那 Fira Gran Via 的 5 號廳 B510 展臺展示我們的
    的頭像 發表于 02-06 11:13 ?287次閱讀

    DAC8718當轉換到第二通時,第一通道轉換出來的信號是否會直持續不變?

    類似 DAC8718這樣的多通道DA,請問當轉換到第二通時,第一通道轉換出來的信號是否會直持續不變?
    發表于 01-10 07:15

    云電腦搭建教程,可云電腦搭建的使用教程

    板是款適合Windows用戶的PHP面板,支持多種Web服務。您可以從官網并安裝小皮面板。 ? ?配置小皮面板:安裝完成后,啟動小皮面板,卸載不需要的服務以節省資源,如Apache和FTP。 ? ?2.部署可云 ? ?可
    的頭像 發表于 01-06 15:42 ?187次閱讀
    可<b class='flag-5'>道</b>云電腦搭建教程,可<b class='flag-5'>道</b>云電腦搭建的使用教程

    ads1278怎么由8通拓展為64通

    剛接觸不久等于小白,問下怎么由8通拓展為64通
    發表于 12-26 07:37

    ADS1256 8通依次采樣,數據不正確怎么解決?

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

    TPA3116D2/TPA3118D2 2.1中的左右聲道,是否需要在前級把低頻部分濾除掉?

    按照datasheet的解法實現2.1聲片做左右聲道,另片做重低音,如下圖: 本人沒做過音頻方面的東西,對2.1不是很了解,現在有如下幾個問題: 1、2.1中的左右聲道,是否
    發表于 10-31 08:00

    SEEKVIEU體機電腦

    體機
    jf_69621499
    發布于 :2024年09月03日 08:50:17

    為什么有些TINA-TI仿真可以實現穩態求解法分析,而有些不行?

    為什么有些TINA-TI仿真可以實現穩態求解法分析,而有些不行,出現提示: ,無法執行穩態分析。 是有什么區別嗎?還是哪里需要設置嗎?
    發表于 08-08 08:28

    Verilog testbench問題求助

    這是我在HDLbits網站上做到的一道題,是testbench,請問這個代碼為什么input都是低電平0?我設置的時鐘就是周期10ns,占空比50%的時鐘信號啊?怎么會出現這種情況......
    發表于 07-21 11:14

    工業安全地毯 給工業生產加上一道安全鎖

    保護裝置
    jf_18500570
    發布于 :2024年05月13日 16:02:47

    數據安全的最后一道防線是數據加密

    信息數據安全領域最薄弱的環節是人,也指人為威脅。 人為威脅可分為無意識的和有意識的。 無意威脅是指因管理和用戶操作失誤而導致的信息泄露或破壞。有意威脅是指某些組織或個人為了自己的目的或利益,直接破壞各種設備,竊取和盜用有價值的數據信息,制造和傳播病毒,或改變系統功能等,這種有意識的威脅最值得關注。 企業的信息數據通常通過聊天工具、電子郵件、網盤、移動存儲和智能手機等渠道泄露。但這些途徑也是最受歡迎的企業
    的頭像 發表于 05-10 13:43 ?392次閱讀

    高實時、高可靠的微內核操作系統——鴻Intewell

    Intewell操作系統源于1990年誕生的“”操作系統,與“”系統脈相承,歷經30年的不懈努力和研發迭代,在功能和性能上已經可以替代風河VxWorks操作系統。發展至今,鴻
    的頭像 發表于 05-07 17:01 ?514次閱讀
    高實時、高可靠的微內核操作系統——鴻<b class='flag-5'>道</b>Intewell

    事關固態電池,中科院大消息!解決行業瓶頸,突破最后一道難關

    行業芯事行業資訊
    北京中科同志科技股份有限公司
    發布于 :2024年04月12日 09:03:24

    LCD液晶顯示屏的分類 lcd屏幕和led屏幕區別

    LCD屏幕的構造大致有:背光層——第一道偏光片——TFT薄膜基板——液晶層——TFT薄膜基板——C/F玻璃(彩色濾光片)——第二偏光片。
    的頭像 發表于 04-01 16:44 ?5818次閱讀
    LCD液晶顯示屏的分類 lcd屏幕和led屏幕區別

    18年,6570個日夜,小熊電器何以撩動年輕人?

    小熊電器,用十八年解一道“年輕方程式”
    的頭像 發表于 03-25 09:23 ?1936次閱讀
    18年,6570個日夜,小熊電器何以撩動年輕人?
    主站蜘蛛池模板: 婷婷久月| 2016天天干 | 久久精品成人免费网站 | 在线亚洲国产精品区 | bt天堂资源种子在线8 | 欧美一区精品 | 天天综合天天 | 69国产成人精品午夜福中文 | 天天做日日干 | 色综合天天网 | 美女免费视频是黄的 | 成人久久网 | 久久国产午夜精品理论片34页 | 国产一二精品 | 2021色噜噜狠狠综曰曰曰 | 久久新视频 | 九九草在线观看 | 国产欧美精品午夜在线播放 | 天堂中文最新版www 天堂资源8中文最新版在线 | 午夜视频精品 | 成人aaa| 岛国一级毛片 | 国产精品污视频 | 欧美 在线播放 | 久久免费特黄毛片 | 丁香六月色婷婷 | 女女综合网 | 精品视频免费看 | 中文字幕第13亚洲另类 | 国产午夜视频在线观看第四页 | aaaaa级毛片免费视频 | 亚洲手机看片 | 黄色片不卡 | 国产精品护士 | 成人在线一区二区三区 | 99精品国产在热久久 | 国产午夜久久精品 | 视频一区视频二区在线观看 | 天天弄天天干 | www.久久在线| 日本亚洲欧美国产日韩ay高清 |